34

Используя такие команды, как 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 ответа3

47

Это связано с тем, как ZSH управляет символами-заглушками для генерации имен файлов. По умолчанию ZSH сгенерирует имена файлов и выдаст ошибку перед выполнением команды, если она не найдет совпадений.

Есть много способов обойти это поведение, вот некоторые из них:

  • Самое быстрое - заключить в кавычки символы с кавычками.
$ rsync -azP "user@server:~/*" ~/
  • Для постоянного изменения вам нужно добавить следующее в ваш файл .zshrc :
unsetopt nomatch

Это не позволит ZSH напечатать ошибку, если совпадение не найдено.

  • Еще одна возможность - отключить глобализацию для определенной команды с помощью модификатора команды noglob . Установив псевдоним в .zshrc например:
alias scp='noglob scp'
5

Я использую 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

Надеюсь, это поможет!

2

Это решает вашу проблему без необходимости вручную цитировать 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)'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .