gpt4 book ai didi

Bash =~ 在 OS X cmd 提示符下丢失 BASH_REMATCH 内容

转载 作者:行者123 更新时间:2023-11-29 09:20:08 33 4
gpt4 key购买 nike

假设我有一个(愚蠢的例子)脚本:

#!/bin/bash
st="one two three"
[[ $st =~ ^([[:alpha:]]+)[[:space:]]([[:alpha:]]+)[[:space:]]([[:alpha:]]+) ]]
for i in "${BASH_REMATCH[@]}"
do
echo "$i"
done

它按预期工作——打印:

one two three
one
two
three

哪个是整体匹配然后是每个匹配组。但是,如果我转到 shell 并键入:

$ st="one two three"
$ [[ $st =~ ^([[:alpha:]]+)[[:space:]]([[:alpha:]]+)[[:space:]]([[:alpha:]]+) ]]
$ for i in "${BASH_REMATCH[@]}"
> do
> echo "$i"
> done

它打印:

w

如果我这样做

$ [[ $st =~ ^([[:alpha:]]+)[[:space:]]([[:alpha:]]+)[[:space:]]([[:alpha:]]+) ]] && arr=( "${BASH_REMATCH[@]}" )

然后我可以遍历 arrBASH_REMATCH 的副本,显示匹配工作正常。但是在 Bash 3.2 上使用交互式 shell 时,BASH_REMATCH 似乎发生了一些变化。匹配成功后。

这是 macOS Sierra 10.12.1 上的默认 3.2.57(1)-release

如果我启动 Bash 4.4,一切正常。

想法?


编辑

Gordon Davis 是正确的:它与使用 "${BASH_REMATCH[@]}" 作为显示提示的一部分的 Apple 实用程序有关。

易于演示:

$ cd ~
$ pwd && echo "${BASH_REMATCH[@]}"
/Users/andrew
w
$ cd /tmp
$ pwd && echo "${BASH_REMATCH[@]}"
/tmp
p

然后如果我在没有 rc 文件的情况下运行 Apple 的 bash:

$ /bin/bash  --norc
bash-3.2$ pwd && echo "${BASH_REMATCH[@]}"
/tmp

bash-3.2$

("${BASH_REMATCH[@]}" 有一个空行……)

最佳答案

发生这种情况是因为 Apple 的默认 bash init 文件有一个定义提示的奇特函数,并且每次需要显示提示时它都会重新计算它,并且该函数使用 =~ 并因此替换了 BASH_REMATCH 的先前内容。请参阅/etc/bashrc_Apple_Terminal 中 update_terminal_cwd 的定义(源自/etc/bashrc)。

如果这给您带来麻烦,我认为使用 unset PROMPT_COMMAND 取消函数定义是安全的(这会保留已定义的函数,但不会使用它)。

顺便说一句,BASH_REMATCH 最终被设置为“w”,因为该函数逐个字符地遍历您的工作目录,并在运行时对它们进行 URL 编码。 “w”显然是您工作目录中的最后一个字符。

编辑:查看函数,它实际上并没有对提示做任何事情;它设置终端窗口标题栏的文件夹部分。如果取消设置 PROMPT_COMMAND,它将停止更新窗口标题。

关于Bash =~ 在 OS X cmd 提示符下丢失 BASH_REMATCH 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456012/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com