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
Morgan
la source

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'
Spack
la source
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!

super-utilisateur
la source
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)'
Francisco
la source
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