我的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
。
答案 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
序列(或任何其他!~
序列)。