Как вы уже выяснили, в zsh есть способ отключить расширение подстановочных знаков для определенных команд. Если вы поместитеnoglob
перед командой, zsh не будет расширять слова команды подстановочными знаками. Поскольку ввод noglob
часто требует таких же усилий, как и цитирование подстановочных знаков в аргументах, наиболее распространенным способом использования является автоматическое закрытие определенных команд путем создания имени команды как псевдонима того же имени команды с префиксом noglob
.. Например, после
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'