Utilisation de caractères génériques dans les commandes avec zsh


40

En utilisant des commandes telles que rsyncet scpavec ZSHj'ai eu des problèmes. Au lieu du comportement (normal) de me donner tous les fichiers correspondants, il ne s'exécutera pas et retournera:

  ~  rsync -azP user@server:~/* ~/
zsh: no matches found: user@server:~/*

Comment puis-je réparer cela?

ma .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

Réponses:


51

Ceci est lié à la façon dont ZSH gère les caractères de remplacement pour générer des noms de fichiers. Par défaut, ZSH générera les noms de fichiers et émettra une erreur avant d'exécuter la commande si aucune correspondance n'est trouvée.

Il existe de nombreuses façons de contourner ce comportement, en voici quelques unes:

  • Le plus rapide est de placer les guillemets entre les caractères globulants.
$ rsync -azP "user@server:~/*" ~/
  • Pour un changement permanent, vous devrez ajouter ce qui suit dans votre .zshrcfichier:
unsetopt nomatch

Cela empêchera ZSH d’imprimer une erreur si aucune correspondance n’est trouvée.

  • Une autre possibilité consiste à désactiver la segmentation pour une commande particulière en utilisant le noglobmodificateur de commande. En définissant un alias dans .zshrcpar exemple:
alias scp='noglob scp'

Merci! Jamais eu à faire ça avec bash.
Morgan

@ Morgan C'est bizarre, en fait. Sans les guillemets, Bash devrait développer le tilde avant de le rsyncvoir. Se pourrait-il que vous utilisiez simplement le même chemin pour le répertoire de base sur les deux serveurs?
Slhck

@slhck Non, il a raison. zsh a quelques options supplémentaires pour configurer les caractères génériques afin que ce comportement puisse être modifié dans le zshrc.
Spack

1
@ sa125 J'ai modifié ma réponse.
Spack

1
@slhck: bashne développe un tilde que lorsqu'il commence un mot ou est le premier caractère après un :ou le premier =d'une affectation de variable. Sinon, il est traité littéralement.
Chepner

8

J'utilise zpretzo depuis quelques mois et j'ai également rencontré ce problème. Je suis tombé sur une solution soignée et utile si vous ne souhaitez apporter aucune modification: il vous suffit de faire précéder la barre oblique inverse de la commande.

~/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

J'espère que ça aide!


Excellente solution !!
Yorch

Parfait, cela fonctionnait très bien pour moi sur OSX!
sMyles

Impressionnant!! Mais pourquoi / comment cela fonctionne?
Kannan Ramamoorthy

3

Cela résout votre problème sans avoir à citer manuellement les 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)'

Et cela va dans .zshrc?
Morgan

oui, cela va dans votre configuration zsh. FWIW, commencez simplement un nouveau shell ( zsh -fpour une conf de canon), copiez et collez les commandes dans votre shell et tapez (ou collez) votre rsynccommande. Vous verrez la magie au travail ;-) (les caractères spéciaux à l'URL seront automatiquement cités)
Francisco

vous devriez accepter ma réponse :-P c'est beaucoup mieux que de citer ou de désactiver globing pour toute la commande.
Francisco
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.