Використання підстановок у командах з zsh


39

Використовуючи команди, такі як 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

Відповіді:


50

Це пов'язано з тим, як ZSH управляє глобальними символами для генерування імен файлів. За замовчуванням ZSH генерує назви файлів і видасть помилку перед виконанням команди, якщо вона не знайде збігів.

Існує багато способів обійти цю поведінку, ось деякі з них:

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

Це не дозволить ZSH надрукувати помилку, коли не може бути знайдено відповідності.

  • Іншою можливістю є відключення глобалізації для певної команди за допомогою noglobмодифікатора команд. Встановивши псевдонім, .zshrcнаприклад:
alias scp='noglob scp'

Спасибі! Ніколи не мав цього робити bash.
Морган

@Morgan Це насправді дивно. Без лапок, Баш повинен розгорнути тильд, перш ніж rsyncколись його побачить. Можливо, ви просто використовували однаковий шлях для домашнього каталогу на обох серверах?
slhck

@slhck Ні, він правий. zsh має ще кілька варіантів налаштування символів, щоб цю поведінку можна змінити в zshrc.
Спак

1
@ sa125 Я відредагував свою відповідь.
Spack

1
@slhck: bashрозгортає тильду лише тоді, коли воно починає слово, або є першим символом, що слідує за a :або першим =у призначенні змінної. В іншому випадку це ставиться буквально.
чепнер

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для канонічної конфігурації оболонки), скопіюйте та вставте команди у свою оболонку та введіть (або вставте) свою rsyncкоманду. Ви побачите магію на роботі ;-) (спеціальні символи за URL-адресою будуть автоматично цитовані)
Франциско

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