Cygwin zsh不认识头^
我在cygwin中使用zsh和prezto。当我键入这个git命令“git reset HEAD5”时,zsh没有找到HEAD^。 但当我切换到使用bash时,它就起作用了Cygwin zsh不认识头^,cygwin,zsh,prezto,Cygwin,Zsh,Prezto,我在cygwin中使用zsh和prezto。当我键入这个git命令“git reset HEAD5”时,zsh没有找到HEAD^。 但当我切换到使用bash时,它就起作用了 $ git reset HEAD^ zsh: no matches found: HEAD^ 有人看到过相同的问题吗?在zsh中,文件名扩展中将^字符视为特殊字符,但仅当设置了扩展\u GLOB选项时: zsh% setopt noEXTEND
$ git reset HEAD^
zsh: no matches found: HEAD^
有人看到过相同的问题吗?在zsh中,文件名扩展中将
^
字符视为特殊字符,但仅当设置了扩展\u GLOB
选项时:
zsh% setopt noEXTENDED_GLOB
zsh% echo HEAD^
HEAD^
zsh% setopt EXTENDED_GLOB
zsh% echo HEAD^
zsh: no matches found: HEAD^
zsh%
Bash没有此功能。(准确地说,bash确实有一个扩展glob特性,由shopt-s extglob
启用,但bash的扩展glob语法并不将^
字符视为特殊字符。)
启用此功能后,^
是一个特殊字符,类似于*
,但含义不同。与*
类似,您可以通过转义来抑制其特殊含义,可以将其括在单引号或双引号中,也可以在其前面加反斜杠。引用是最简单的解决办法
而不是
git reset HEAD^
试试这个:
git reset 'HEAD^'
^
通配符的含义并不相关,因为您需要做的就是避免使用它,但我还是要提到它。根据zsh手册,^X
匹配除模式X
之外的任何内容。对于HEAD^
的情况,在^
之后没有任何内容,这意味着HEAD^
匹配HEAD
,后跟除nothing以外的任何内容。这是一种迂回的说法,HEAD^
匹配以HEAD
开头,后跟一些非空字符串的文件名。给定文件HEAD
、HEAD1
和HEAD2
,模式HEAD^
匹配HEAD1
和HEAD2
避免^
字符的快速解决方法是使用git reset HEAD~1
而不是git reset HEAD^
请参阅。oh my zsh描述了这种确切的行为并提供了解决方案
罪魁祸首是zsh上的选项extended_glob
。普雷斯托一定在设置它。因此,当您键入HEAD^
zsh时,它会尝试创建一个全局否定表达式,但由于错误而失败
换句话说,setopt extended_glob
允许我们使用^
来否定glob
要修复它,您可以在.zshrc
上写这一行:
unsetopt nomatch
在上面这一行中,我们对zsh说,当模式匹配失败时,只需使用命令“按原样”即可。不建议取消设置
nomatch
,以避免此错误。对于用户可能不希望或不期望的所有其他shell代码,这将具有连锁行为。最好是引用字符串git reset“HEAD^”
,转义字符git reset HEAD\^
,或者在合适的情况下使用波浪线git reset HEAD~1
我看不出有问题,因为脚本可以使用/usr/bin/env zsh-f
,我不确定使用#/usr/bin/env zsh
使脚本从~/.zshrc
获取配置。如果是这样的话,那可能是个问题。即使这样,脚本也应该设置自己的选项以确保安全。它不应该依赖于用户特定的配置。这是真的,但我仍然会犹豫在我的系统上这样做,至少因为它改变了全球化模式的预期行为,如果你不留神的话,它可能会抓住你。例如,var=(*.fooext)
withnomatch
unset将不会产生错误,如果全局匹配失败,它将在var
数组中创建一个名为“*.fooext”的字符串。这可能不是你所期望的。再说一遍,这些可能只是边缘情况,我想这取决于用户自己决定他们想要的系统。。。