Git 是否可以擦除或覆盖zsh';s prexec()错误行为?
我最近发现了zsh中的preexec()和precmd()函数,并提出了一种新的方法来使用shell中的挤压功能 此prexec()函数用于检查您刚刚尝试运行的“命令” 以“http”开头,以“.git”结尾,如果是,它将自动cd到我的源目录并签出源代码。所以我只是把它粘贴进去,按回车键,就可以开始比赛了。否则,任何正常(或错误)都应该看起来正常Git 是否可以擦除或覆盖zsh';s prexec()错误行为?,git,zsh,Git,Zsh,我最近发现了zsh中的preexec()和precmd()函数,并提出了一种新的方法来使用shell中的挤压功能 此prexec()函数用于检查您刚刚尝试运行的“命令” 以“http”开头,以“.git”结尾,如果是,它将自动cd到我的源目录并签出源代码。所以我只是把它粘贴进去,按回车键,就可以开始比赛了。否则,任何正常(或错误)都应该看起来正常 function preexec() { [[ "$1" =~ "^http.*.git\$" ]] && cd /usr/loc
function preexec() {
[[ "$1" =~ "^http.*.git\$" ]] && cd /usr/local/src && git clone "$1"
}
现在让我陷入困境的是,似乎没有任何方法可以忽略或覆盖您得到的“无法找到命令”错误
zsh:没有这样的文件或目录:
我尝试覆盖“1”,ZLE\u LINE\u中止,使用noglob翻转2>&1,返回1,0。。等等,运气不好
任何zsh smarties都知道如何抑制错误消息?正确答案是不要使用pre*函数,而是使用命令\u not\u found\u handler函数。这也适用于较新版本的bash 谢普纳和扬·克鲁格为解决这一问题所做的努力值得赞扬
function command_not_found_handle {
if [[ "$1" =~ "^(https|http|git|(git\\+)?ssh)://.*\$" ]]; then
echo "Do something: $1"
return 1
else
return 0
fi
}
看起来,在执行preexec()时,shell已经试图找到要执行的命令,因此您看到的行为有一定的意义。在zsh的命令行编辑器中将其作为一个完成函数实现可能会更幸运。当然,这使得界面略有不同,但这也许不是一件坏事。它甚至可以作为zle line finish小部件,但我没有这方面的经验。感谢您的关注,我还没有考虑将其作为基于完成的任务。我猜如果我粘贴它并点击tab,则其笔划数与粘贴并点击enter相同p您可能希望使用
命令\u not\u found\u handler
而不是preexec
,因为您希望运行的是某个内容而不是URL,而不是URL.Hm之前的内容。我尝试了一些简单的方法,比如command\u not\u found\u handler(){print$1;return 0;}
,如果缺少的命令是URL,则似乎不会调用它zsh
似乎在确定URL是一个缺少的命令名之前试图访问该URL。@chepner我也尝试过,在一个稍微修改的版本中(在这个注释的末尾),它成功了,zsh 5.0.2。可能是其他什么东西正在拦截您的设置中的URL?在zsh的文档中,我没有看到任何提示URL在默认情况下以任何方式尝试作为命令的内容command_not_found_handler(){[[“$1”=~”^(https | git |(git\\+)?ssh)://.\\\\\.git\$”]|返回1;echo$1;返回0}
这个问题与您的问题相关。你能检查一下吗?