我已经切换到 zsh,并且工作正常。一件奇怪的事情是,当我尝试使用 * 通配符进行 scp 时,它不起作用,我必须进入 bash。下面的第二个命令工作正常。
关于为什么会出现这种情况以及如何解决它有什么想法吗?
~/dmp ⌚ 16:06:10
$ scp abc@123:/home/se/exports/201405091107/* .
zsh: no matches found: root@uf3:/home/se/exports/201405091107/*
~/dmp ⌚ 16:06:53
$ bash
sean@seanlaptop:~/dmp$ scp abc@123:/home/se/exports/201405091107/* .
答案1
shell(bash 和 zsh)尝试解释abc@123:/home/se/exports/201405091107/*
为 glob 以匹配本地系统上的文件。 shell 不知道scp
是什么,也不知道您正在尝试匹配远程文件。
bash 和 zsh 之间的区别在于它们在通配失败时的默认行为。在 bash 中,如果 glob 不匹配任何内容,它将传递原始 glob 模式作为参数。在 zsh 中它会抛出错误。
要解决此问题,您需要引用它,以便 shell 不会尝试将其解释为本地 glob。
scp 'abc@123:/home/se/exports/201405091107/*' .
(其他类似...1107/'*'
或...1107/\*
工作也行)
如果您想更改它以使 zsh 不匹配行为与 bash 相同,您可以执行以下操作
setopt nonomatch
答案2
在以下位置查看此答案https://superuser.com/a/740728/978073
对于 zprezto 用户,在命令前面加上反斜杠是有效的!
代替,
$ scp <command>
和
$ \scp <command>
答案3
我在 MacOS Catalina 上,setopt nonomatch 没有效果。
解决了以下问题https://superuser.com/a/740728/978073
要使其永久,请编辑 ~/.zshrc :
#alias scp='noglob scp'
alias scp='\scp'