Использование подстановочных знаков в командах с zsh
Использование таких команд, как rsync
а также scp
с ZSH
Я столкнулся с проблемой. Вместо (нормального) поведения, связанного со всеми соответствующими файлами, он не запускается и возвращает:
➜ ~ rsync -azP user@server:~/* ~/
zsh: no matches found: user@server:~/*
Как я могу это исправить?
мой .zshrc
ZSH=$HOME/.oh-my-zsh
ZSH_THEME="robbyrussell"
plugins=(git brew)
source $ZSH/oh-my-zsh.sh
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/sbin
3 ответа
Это связано с тем, как ZSH управляет символами-заглушками для генерации имен файлов. По умолчанию ZSH сгенерирует имена файлов и выдаст ошибку перед выполнением команды, если она не найдет совпадений.
Есть много способов обойти это поведение, вот некоторые из них:
- Самое быстрое - заключить в кавычки символы с кавычками.
$ rsync -azP "user@server:~/*" ~/
- Для постоянного изменения вам необходимо добавить следующее в
.zshrc
файл:
unsetopt nomatch
Это не позволит ZSH напечатать ошибку, если совпадение не найдено.
- Еще одна возможность - отключить глобализацию для определенной команды, используя
noglob
модификатор команды. Установив псевдоним в.zshrc
например:
alias scp='noglob scp'
Я использую zpretzo в течение довольно нескольких месяцев, а также столкнулся с этой проблемой. Я наткнулся на аккуратное и полезное решение, если вы не хотите вносить какие-либо изменения: просто добавьте обратную косую черту в команду.
~/p/b/a/files ❯❯❯ scp *.* myserver@host:~/
*.*: No such file or directory
~/p/b/a/files ❯❯❯ \scp *.* myserver@host:~/
jquery.min.js 100% 93KB 92.6KB/s 00:00
json2.min.js 100% 3377 3.3KB/s 00:00
Надеюсь, это поможет!
Это решает вашу проблему без необходимости вручную цитировать URL
autoload -U url-quote-magic
zle -N self-insert url-quote-magic
# sort it out for SCP
some_remote_commands=(scp rsync)
zstyle -e :urlglobber url-other-schema \
'[[ $some_remote_commands[(i)$words[1]] -le ${#some_remote_commands} ]] && reply=("*") || reply=(http https ftp)'