scp 通配符在 zsh 中不起作用

tv_*_*gar 38 scp zsh wildcards

我已经切换到 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/* .
Run Code Online (Sandbox Code Playgroud)

phe*_*mer 48

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/*' .
Run Code Online (Sandbox Code Playgroud)

(其他事情也喜欢...1107/'*'或...1107/\*工作)

如果要更改它以使 zsh 不匹配行为与 bash 相同,则可以执行以下操作

setopt nonomatch
Run Code Online (Sandbox Code Playgroud)

  • 你会把`setopt nonomatch` 语句放在.zshrc 或.zprofile 中吗?我是 zsh 的新手。 (2认同)
  • 通常`.zshrc` (2认同)