scp、globbing 和不同的 shell

scp、globbing 和不同的 shell

前几天在工作时我尝试做

scp remotehost:~/*.txt .

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

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

答案1

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

scp remotehost:\*.txt .

或使用引用,

scp 'remotehost:*.txt' .

或使用zsh特定的noglob“预命令修饰符”(shell 不会尝试扩展命令中的任何 glob),

noglob scp remotehost:*.txt .

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

相关内容