Polecenie scp działające w bash nie działa w zsh

15

To polecenie działa dobrze w bash:

bash-3.2$ scp luna4:/u/paige/maye/src/diviner/notebooks/plots/hk_* .
hk_az.png                                                   100%  126KB 126.0KB/s   00:00
hk_baffle.png                                               100%  166KB 166.3KB/s   00:01
hk_bb.png                                                   100%  144KB 143.8KB/s   00:00
hk_el.png                                                   100%  115KB 115.3KB/s   00:00
hk_fpa.png                                                  100%  123KB 123.2KB/s   00:00
hk_fpb.png                                                  100%  126KB 125.7KB/s   00:00
hk_hybrid.png                                               100%   99KB  98.7KB/s   00:00
hk_oba.png                                                  100%  140KB 139.7KB/s   00:00
hk_solar.png                                                100%  206KB 205.6KB/s   00:00
hk_temp.png                                                 100%   62KB  61.8KB/s   00:00
hk_yoke.png                                                 100%  122KB 121.7KB/s   00:00
bash-3.2$ exit

ale w Zsh kończy się niepowodzeniem, nie znaleziono plików:

$ scp luna4:/u/paige/maye/src/diviner/notebooks/plots/hk_* .
zsh: no matches found: luna4:/u/paige/maye/src/diviner/notebooks/plots/hk_*

Co idzie nie tak?

K.-Michael Aye
źródło
Zastanawiałem się, czy publikowanie tutaj jest w porządku, ale szukałem zsh i scp i znalazłem wiele wpisów, z których żaden nie został oznaczony jako „wstrzymany”, inaczej nie opublikowałbym go tutaj.
K.-Michael Aye,

Odpowiedzi:

16

Problemem jest to, że zshjest globbing zdalną ścieżkę. Możesz to zweryfikować przez

scp luna4:"/u/paige/maye/src/diviner/notebooks/plots/hk_*" .

Aby wyłączyć globowanie dla zdalnych ścieżek scp, ale w przeciwnym razie pozostaw globbing to samo ( stąd ) dodaj to do swojego .zshrc-

# Disable globbing on the remote path.
alias scp='noglob scp_wrap'
function scp_wrap {
  local -a args
  local i
  for i in "$@"; do case $i in
    (*:*) args+=($i) ;;
    (*) args+=(${~i}) ;;
  esac; done
  command scp "${(@)args}"
}
Elliott Frisch
źródło
1
Twoje zdrowie. Potwierdzony. Czy mogę to wyłączyć?
K.-Michael Aye,
1
@ K.-MichaelAye Edytowana odpowiedź, ale tak.
Elliott Frisch,
I ten hack też działa. Wielkie dzięki! (Dodano go do mojego .zshrc)
K.-Michael Aye,
4

Jeśli używasz pojedynczych cudzysłowów, to działa:

scp 'remote.host.com:files*' .
Naveed Ahmed
źródło
Daję ci +1, ponieważ była to prosta poprawka w korzystaniu z Cygwin. Dzięki!
Carlos
prosta i łatwa naprawa. Dzięki! nie ma potrzeby dalszego zaczepiania.
kate