Использование подстановочных знаков в командах с zsh


40

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

Ответы:


51

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

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

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

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

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

Благодарность! Никогда не приходилось делать это с bash.
Морган

@Morgan На самом деле это странно. Без кавычек Bash должен расширить тильду прежде, чем rsyncкогда-либо ее увидит. Может быть, вы просто использовали один и тот же путь для домашнего каталога на обоих серверах?
Slhck

@slhck Нет, он прав. У zsh есть еще несколько опций для настройки подстановочных знаков, так что это поведение можно изменить в zshrc.
Спек

1
@ sa125 Я отредактировал свой ответ.
Спак

1
@slhck: bashраскрывает тильду, только когда начинается слово, или является первым символом после :или первым =в присваивании переменной. В противном случае это трактуется буквально.
chepner

8

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

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


Отличное решение !!
Йорк

Отлично, это отлично сработало для меня на OSX!
sMyles

Потрясающе!! Но есть ли причина / почему это работает?
Каннан Рамамурти

3

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

И это идет в .zshrc?
Морган,

да, это входит в вашу конфигурацию zsh. FWIW, просто запустите новую оболочку ( zsh -fдля канонической оболочки conf), скопируйте и вставьте команды в вашей оболочке и введите (или вставьте) вашу rsyncкоманду. Вы увидите магию на работе ;-) (специальные символы в URL будут автоматически указаны)
Франциско

Вы должны принять мой ответ: - P, это намного лучше, чем цитировать или отключать глобирование для всей команды.
Франциско
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.