我是一个相对较新的zsh用户,并且99%的时间喜欢它。当我试图复制一堆文件时(如:
[I] ➜ ls *17*
core.txt.17 info.17 vmcore.17.zst但当我scp *17* xxx:xxx/xxx时,我得到:
[I] ➜ scp *17* freefall.freebsd.org:
*17*: No such file or directory
ler in /var/crash at borg
[I] ➜为什么?
如果我运行type scp,我会得到:
scp is an alias for noglob scp
scp is /usr/bin/scp发布于 2019-07-23 23:30:03
正如您已经发现的,zsh有一种方法可以禁用某些命令上的通配符扩展。如果将noglob放在命令前面,则zsh不会对命令的文字进行通配符扩展。由于键入noglob与在参数中引用通配符一样费劲,所以最常见的用法是通过将命令名作为带有noglob前缀的同一个命令名的别名,从而自动导致某些命令“noglobbed”。例如,之后
alias scp='noglob scp'您不会在scp命令行上获得任何通配符扩展,但除此之外,scp命令将正常运行。
您可以绕过别名
\scp *17* freefall.freebsd.org: 或
=scp *17* freefall.freebsd.org: \scp绕过别名,以该名称查找函数、内置命令或外部命令。=scp只查找外部命令。
防止scp参数的通配符扩展使您可以在没有引号的情况下编写scp remote:*17*,但是它具有不允许您编写scp *17* remote:的主要缺点。如果scp的参数看起来不像远程文件名,那么就有可能进一步扩展它们的通配符。这里有一个函数,它分析scp的参数,并且只在不像选项或远程文件名的参数中展开通配符。
function glob_non_remote {
local a x
a=($1); shift
for x; do
# Do wildcard expansion manually, but only for arguments that don't look
# like options or remote file names.
case $x in
(*:*|-*|) a+=("$x");;
*) a+=($~x);;
esac
done
"${(@)a}"
}
alias scp='noglob glob_non_remote scp'https://unix.stackexchange.com/questions/530245
复制相似问题