首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash =~在cmd提示符OS上释放BASH_REMATCH内容

Bash =~在cmd提示符OS上释放BASH_REMATCH内容
EN

Stack Overflow用户
提问于 2016-11-07 00:07:21
回答 1查看 1.1K关注 0票数 3

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

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

它能像预期的那样工作--打印:

代码语言:javascript
复制
one two three
one
two
three

这是整个比赛的结果,然后是每个比赛组。但是,如果我转到shell并键入:

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

它打印:

代码语言:javascript
复制
w

如果我做了

代码语言:javascript
复制
$ [[ $st =~ ^([[:alpha:]]+)[[:space:]]([[:alpha:]]+)[[:space:]]([[:alpha:]]+) ]] && arr=( "${BASH_REMATCH[@]}" )

然后,我可以循环遍历BASH_REMATCHarr中的副本,显示匹配正常。但是,在Bash3.2上的交互式shell使用中,BASH_REMATCH似乎发生了一些事情。在一场成功的比赛之后。

这是默认的3.2.57(1)-release on macOS塞拉利昂10.12.1

如果我启动Bash4.4,一切正常。

想法?

编辑

戈登·戴维斯( Gordon )是对的:这与一个使用"${BASH_REMATCH[@]}"作为显示提示符的一部分的苹果实用工具有关。

易于证明:

代码语言:javascript
复制
$ cd ~
$ pwd && echo "${BASH_REMATCH[@]}"
/Users/andrew
w
$ cd /tmp
$ pwd && echo "${BASH_REMATCH[@]}"
/tmp
p

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

代码语言:javascript
复制
$ /bin/bash  --norc
bash-3.2$ pwd && echo "${BASH_REMATCH[@]}"
/tmp

bash-3.2$ 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,它将停止更新窗口标题。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40456012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档