Cygwin zsh不认识头^

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

我在cygwin中使用zsh和prezto。当我键入这个git命令“git reset HEAD5”时,zsh没有找到HEAD^。 但当我切换到使用bash时,它就起作用了

$ 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)
with
nomatch
unset将不会产生错误,如果全局匹配失败,它将在
var
数组中创建一个名为“*.fooext”的字符串。这可能不是你所期望的。再说一遍,这些可能只是边缘情况,我想这取决于用户自己决定他们想要的系统。。。