在 zsh 命令中使用通配符

Mor*_*gan 49 terminal zsh shell oh-my-zsh macos

使用诸如rsyncscpwith 之类的命令ZSH遇到了麻烦。而不是给我所有匹配文件的(正常)行为,它不会运行并返回:

?  ~  rsync -azP user@server:~/* ~/
zsh: no matches found: user@server:~/*
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

我的 .zshrc

ZSH=$HOME/.oh-my-zsh
ZSH_THEME="robbyrussell"
plugins=(git brew)
source $ZSH/oh-my-zsh.sh
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/sbin
Run Code Online (Sandbox Code Playgroud)

Spa*_*ack 62

这与 ZSH 如何管理通配符以生成文件名有关。默认情况下,如果没有找到匹配项,ZSH 将生成文件名并在执行命令之前抛出错误。

有很多方法可以绕过这种行为,以下是其中一些:

  • 最快的方法是用引号将通配符括起来。
$ rsync -azP "user@server:~/*" ~/
Run Code Online (Sandbox Code Playgroud)
  • 要进行永久性更改,您必须在.zshrc文件中添加以下内容:
unsetopt nomatch
Run Code Online (Sandbox Code Playgroud)

这将防止 ZSH 在找不到匹配项时打印错误。

  • 另一种可能性是使用noglob命令修饰符禁用特定命令的通配。.zshrc例如通过设置别名:
alias scp='noglob scp'
Run Code Online (Sandbox Code Playgroud)


sup*_*roi 9

我已经使用 zpretzo 好几个月了,也遇到了这个问题。如果您不想进行任何更改,我遇到了一个简洁而有用的解决方案:只需在命令前加上反斜杠即可。

~/p/b/a/files ??? scp *.* myserver@host:~/
*.*: No such file or directory

~/p/b/a/files ??? \scp *.* myserver@host:~/
jquery.min.js                              100%   93KB  92.6KB/s   00:00
json2.min.js                               100%   3377   3.3KB/s   00:00
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

  • 惊人的!!但是有什么理由/这是如何工作的? (2认同)

Fra*_*sco 6

这可以解决您的问题,而无需手动引用 URL

autoload -U url-quote-magic  
zle -N self-insert url-quote-magic

# sort it out for SCP
some_remote_commands=(scp rsync)
zstyle -e :urlglobber url-other-schema \
  '[[ $some_remote_commands[(i)$words[1]] -le ${#some_remote_commands} ]] && reply=("*") || reply=(http https ftp)'
Run Code Online (Sandbox Code Playgroud)