Verwenden von Platzhaltern in Befehlen mit zsh

39

Mit Befehlen wie rsyncund scpmit ZSHhabe ich Probleme bekommen. Anstelle des (normalen) Verhaltens, mir alle passenden Dateien zu geben, wird es nicht ausgeführt und gibt Folgendes zurück:

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

Wie kann ich das beheben?

Meine .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
quelle

Antworten:

50

Dies hängt damit zusammen, wie ZSH globale Zeichen verwaltet, um Dateinamen zu generieren. Standardmäßig generiert ZSH die Dateinamen und gibt einen Fehler aus, bevor der Befehl ausgeführt wird, wenn keine Übereinstimmungen gefunden werden.

Es gibt viele Möglichkeiten, dieses Verhalten zu umgehen. Hier einige davon:

  • Am schnellsten schließen Sie die Zeichen in Anführungszeichen ein.
$ rsync -azP "user@server:~/*" ~/
  • Für eine dauerhafte Änderung müssen Sie Folgendes in Ihre .zshrcDatei einfügen:
unsetopt nomatch

Dies verhindert, dass ZSH einen Fehler ausgibt, wenn keine Übereinstimmung gefunden wird.

  • Eine andere Möglichkeit besteht darin, das Globbing für einen bestimmten Befehl mit dem noglobBefehlsmodifikator zu deaktivieren . Durch Festlegen eines Alias ​​in .zshrczum Beispiel:
alias scp='noglob scp'
Spack
quelle
Vielen Dank! Musste das nie damit machen bash.
Morgan
@ Morgan Das ist eigentlich komisch. Ohne die Anführungszeichen sollte Bash die Tilde erweitern, bevor sie rsyncjemals gesehen wird. Könnte es sein, dass Sie auf beiden Servern nur denselben Pfad für das Basisverzeichnis verwendet haben?
Slhck
@slhck Nein, er hat recht. zsh bietet einige weitere Optionen zum Konfigurieren von Platzhaltern, damit dieses Verhalten in zshrc geändert werden kann.
Spack
1
@ sa125 Ich habe meine Antwort bearbeitet.
Spack
1
@slhck: Erweitert basheine Tilde nur, wenn sie mit einem Wort beginnt , oder ist das erste Zeichen nach einem :oder dem ersten =in einer variablen Zuweisung. Ansonsten wird es wörtlich behandelt.
Chepner
8

Ich benutze zpretzo seit einigen Monaten und habe dieses Problem auch erlebt. Ich habe eine nette und nützliche Lösung gefunden, wenn Sie keine Änderungen vornehmen möchten: Stellen Sie dem Befehl einfach einen Backslash voran.

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

Ich hoffe das hilft!

superuseroi
quelle
Tolle Lösung !!
yorch
Perfekt, das hat unter OSX sehr gut funktioniert!
sMyles
Genial!! Aber warum / wie funktioniert das?
Kannan Ramamoorthy
3

Dies löst Ihr Problem, ohne die URLs manuell angeben zu müssen

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
quelle
Und das geht in .zshrc?
Morgan
ja, das geht in deine zsh konfiguration. FWIW, starten Sie einfach eine neue Shell ( zsh -ffür eine kanonische Shell-Konfiguration), kopieren Sie die Befehle in Ihre Shell und geben Sie Ihren rsyncBefehl ein (oder fügen Sie ihn ein) . Sie werden die Magie bei der Arbeit sehen ;-) (spezielle Zeichen an der URL werden automatisch zitiert)
Francisco
Sie sollten meine Antwort akzeptieren :-P Dies ist viel besser als das Zitieren oder Deaktivieren des Globings für den gesamten Befehl.
Francisco