Bash =?在cmd提示符OS X处丢失BASH_REMATCH内容
假设我有一个(愚蠢的例子)脚本:
#!/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,它将停止更新窗口标题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |