加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash =?在cmd提示符OS X处丢失BASH_REMATCH内容

发布时间:2020-12-16 01:49:40 所属栏目:安全 来源:网络整理
导读:假设我有一个(愚蠢的例子)脚本: #!/bin/bashst="one two three"[[ $st =~ ^([[:alpha:]]+)[[:space:]]([[:alpha:]]+)[[:space:]]([[:alpha:]]+) ]]for i in "${BASH_REMATCH[@]}"do echo "$i"done 它按预期工作 – 它打印: one two threeonetwothree 这是
假设我有一个(愚蠢的例子)脚本:

#!/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[@]}" )

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

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

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

想法?

编辑

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

易于演示:

$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提供).

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读