假设我有一个(愚蠢的例子)脚本:
#!/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[@]}" )然后,我可以循环遍历BASH_REMATCH在arr中的副本,显示匹配正常。但是,在Bash3.2上的交互式shell使用中,BASH_REMATCH似乎发生了一些事情。在一场成功的比赛之后。
这是默认的3.2.57(1)-release on macOS塞拉利昂10.12.1
如果我启动Bash4.4,一切正常。
想法?
编辑
戈登·戴维斯( Gordon )是对的:这与一个使用"${BASH_REMATCH[@]}"作为显示提示符的一部分的苹果实用工具有关。
易于证明:
$ cd ~
$ pwd && echo "${BASH_REMATCH[@]}"
/Users/andrew
w
$ cd /tmp
$ pwd && echo "${BASH_REMATCH[@]}"
/tmp
p然后,如果我在没有rc文件的情况下运行苹果的bash:
$ /bin/bash --norc
bash-3.2$ pwd && echo "${BASH_REMATCH[@]}"
/tmp
bash-3.2$ ( "${BASH_REMATCH[@]}"有一个空行.)
发布于 2016-11-07 04:43:42
这是因为Apple的默认bash文件有一个特殊的函数来定义提示符,而且每次需要显示提示符时,它都会重新计算提示符,并且该函数使用=~,因此替换了BASH_REMATCH以前的内容。请参见/etc/bashrc_Apple终端中update_terminal_cwd的定义(该定义由/etc/bashrc提供)。
如果这会给您带来麻烦,我认为用unset PROMPT_COMMAND取消函数定义是安全的(这样就可以定义函数,但不使用它)。
顺便说一句,BASH_REMATCH最终被设置为"w“,因为函数按字符逐个遍历您的工作目录字符,然后对它们进行编码。"w“显然是工作目录中的最后一个字符。
编辑:查看这个函数,它实际上没有对提示做任何事情;它设置了终端窗口标题栏的文件夹部分。如果取消设置PROMPT_COMMAND,它将停止更新窗口标题。
https://stackoverflow.com/questions/40456012
复制相似问题