scp、通配符和不同的 shell

xen*_*ide 4 shell bash ssh zsh wildcards

前几天在工作时我试着做

scp remotehost:~/*.txt .
Run Code Online (Sandbox Code Playgroud)

我收到了一个关于 **.txt file not found 抱歉,不在工作中的错误,我忘记了确切的错误

在我的工作站上,我运行zsh4.3。远程主机上bash是默认 shell,并且版本zsh较旧(4.24.3)。然后我尝试在我的工作站上切换到 bash,并执行完全相同的命令。这次成功了。什么是根本原因。无论如何要在这两个系统之间进行通配符或通配符(无需切换到bash)?

Kei*_*ith 8

zsh 的行为在这里与大多数其他 shell 略有不同。其他 shell,如 bash,尝试扩展通配符。如果它们无法扩展为任何内容,则将文字字符串(包含通配符)传递给应用程序。但是 zsh 不这样做(好吧,有一个选项,可以做或不做)。zsh 将打印该错误而不执行命令。如果您确实希望将通配符传递给应用程序,则可以通过转义通配符来覆盖它。在这种情况下,您这样做是因为您希望另一侧外壳扩展它。所以使用:

scp remotehost:\*.txt .
Run Code Online (Sandbox Code Playgroud)

这实际上是正确的行为,因为如果您家中确实有一些本地 *.txt 文件,它们将被扩展为远程上可能不存在的名称。那不是你想要的。