web-dev-qa-db-fra.com

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

En utilisant des commandes telles que rsync et scp avec ZSH, j'ai rencontré 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?

Mon .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
35
Morgan

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 fichier .zshrc:
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 modificateur de commande noglob. En définissant un alias dans .zshrc par exemple:
alias scp='noglob scp'
47
Spack

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!

7
superuseroi

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)'
3
Francisco