scp 通配符在 zsh 中不起作用

scp 通配符在 zsh 中不起作用

我已经切换到 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'

相关内容