4

我的 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

4

2 回答 2

13

在 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 处理引用的方式。

于 2014-01-20T14:08:12.753 回答
2

来自man zshoptions

BANG_HIST (+K) 执行文本历史扩展,csh 样式,处理字符“!” 特别。

在你的行setopt -K之后放置应该防止它扩展命令中的任何序列(或任何其他序列)。source $ZSH/oh-my-zsh.sh.zshrc!~!

于 2014-01-20T13:25:03.737 回答