如何禁用zsh特殊变量(bang tilde!〜)?

时间:2013-07-10 15:49:28

标签: zsh

我的zsh正在用我之前运行的命令替换!~。这是一个问题,因为当我运行awk '$1 !~ /abc/时,它会用命令替换!~

有关如何禁用此功能的任何想法?这可能不是zsh的错,但是在谷歌搜索了一个小时而没有找到任何东西之后,我认为它是最有可能的候选人。

更新:

仅当换行符出现!~时才会发生这种情况:

echo !~
# ~/bin/test_translate.rb

echo foo | awk '
$1 !~ /abc/'

awk: cmd. line:2:     $1 ~/bin/test_translate.rb /abc/
awk: cmd. line:2:                            ^ syntax error
awk: cmd. line:3:     $1 ~/bin/test_translate.rb /abc/
awk: cmd. line:3:                                     ^ unexpected newline or end of string

更新2:

我已将其缩小到.zshrc中的这一行:

source $ZSH/oh-my-zsh.sh

我想找出使zsh替换!~加空格键到我访问的最后一个路径的选项,但我不想停止使用oh-my-zsh。我没有手动修改$ZSH/oh-my-zsh.sh

2 个答案:

答案 0 :(得分:9)

在zsh(以及其他一些shell)中!触发历史记录扩展(请参阅man zshexpn部分“HISTORY EXPANSION”)。在!~的情况下,zsh将查找以~开头的最新命令。

如果您不以任何方式使用历史记录扩展,只需将其添加到.zshrc

即可将其停用
setopt nobanghist

通常历史记录扩展不是在单引号字符串中完成的,所以它不应该以任何方式影响你的awk命令:

$ echo !~
~/docs
$ echo foo | awk '
$1 !~ /abc/'            
foo

另一方面,内部双引号历史记录扩展已完成,您将收到上述错误消息:

$ echo !~
~/docs
$ echo foo | awk "
$1 !~ /abc/"   
echo foo | awk "
$1 ~/docs /abc/"
awk: cmd. line:2:  ~/docs /abc/
awk: cmd. line:2:  ^ syntax error
awk: cmd. line:3:  ~/docs /abc/
awk: cmd. line:3:              ^ unexpected newline or end of string

所以,如果问题可以追溯到source $ZSH/oh-my-zsh.sh,我猜那个哦,我的ZSH 会破坏zsh处理引用的方式。

答案 1 :(得分:1)

来自man zshoptions

  

BANG_HIST(+ K)                 执行文本历史扩展,csh风格,处理字符`!'特别

setopt -K放在source $ZSH/oh-my-zsh.sh的{​​{1}}行后面,可以防止它在命令中扩展任何.zshrc序列(或任何其他!~序列)。