Uso dei caratteri jolly nei comandi con zsh


40

Usando comandi come rsynce scpcon ZSHho avuto dei problemi. Invece del comportamento (normale) di darmi tutti i file corrispondenti, non verrà eseguito e restituirà:

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

Come posso risolvere questo problema?

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

Risposte:


51

Ciò è correlato al modo in cui ZSH gestisce i caratteri globbing per generare nomi di file. Per impostazione predefinita, ZSH genererà i nomi dei file e genererà un errore prima di eseguire il comando se non trova corrispondenze.

Esistono molti modi per aggirare questo comportamento, eccone alcuni:

  • Il più veloce è racchiudere tra virgolette i personaggi traballanti.
$ rsync -azP "user@server:~/*" ~/
  • Per una modifica permanente, dovrai aggiungere quanto segue nel tuo .zshrcfile:
unsetopt nomatch

Ciò impedirà a ZSH di stampare un errore quando non è possibile trovare una corrispondenza.

  • Un'altra possibilità è disabilitare il globbing per un particolare comando usando il noglobmodificatore di comando. Impostando un alias .zshrcper esempio:
alias scp='noglob scp'

Grazie! Non ho mai dovuto farlo con bash.
Morgan,

@Morgan Questo è strano, in realtà. Senza le virgolette, Bash dovrebbe espandere la tilde prima di vederla rsync. Potrebbe essere che stavi usando lo stesso percorso per la home directory su entrambi i server?
Slhck,

@slhck No, ha ragione. zsh ha alcune altre opzioni per configurare i caratteri jolly in modo che questo comportamento possa essere modificato in zshrc.
Spacca il

1
@ sa125 Ho modificato la mia risposta.
Spacca il

1
@slhck: bashespande una tilde solo quando inizia una parola, oppure il primo carattere segue una :o la prima =in un'assegnazione variabile. Altrimenti, viene trattato letteralmente.
Chepner,

8

Uso zpretzo da diversi mesi e ho riscontrato questo problema. Ho trovato una soluzione chiara e utile se non vuoi apportare modifiche: basta anteporre una barra rovesciata al comando.

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

Spero che aiuti!


Ottima soluzione !!
yorch

Perfetto, questo ha funzionato alla grande su OSX!
sMyles,

Eccezionale!! Ma qualche motivo per cui / come funziona?
Kannan Ramamoorthy,

3

Questo risolve il tuo problema senza dover citare manualmente gli 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)'

E questo va in .zshrc?
Morgan,

sì, questo va nella tua configurazione zsh. FWIW, basta avviare una nuova shell ( zsh -fper una conf confusione di shell canonica), copiare e incollare i comandi nella shell e digitare (o incollare) il rsynccomando. Vedrai la magia al lavoro ;-) (i caratteri speciali dell'URL verranno quotati automaticamente)
Francisco

dovresti accettare la mia risposta :-P questo è molto meglio che citare o disattivare il globing per l'intero comando.
Francisco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.