前几天在工作时我尝试做
scp remotehost:~/*.txt .
我收到了一个关于 的错误 *
,*.txt file not found
抱歉,不在工作,我忘记了确切的错误
在我的工作站上我运行zsh
4.3。远程主机上bash
是默认 shell,并且版本zsh
较旧(4.2与4.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 文件,它们将被扩展为远程上可能不存在的名称。那不是你想要的。