команда scp, работающая в bash, не работает в zsh

14

Эта команда прекрасно работает в 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

но в Zsh это не удается, файлы не найдены:

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

Что не так?

К.-Майкл Ай
источник
Я задавался вопросом, можно ли публиковать это здесь, но я искал zsh и scp и нашел много записей, ни одна из которых не помечена как отложенная, иначе я бы не разместил их здесь.
К.-Майкл Ай

Ответы:

16

Проблема заключается в том, что zshэто подстановка удаленного пути. Вы можете проверить это

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

Чтобы отключить глобализацию для удаленных путей scp, но в противном случае оставьте глобализацию такой же ( отсюда ), добавьте это к своему .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}"
}
Эллиот Фриш
источник
1
Приветствия. Подтверждено. Могу ли я выключить это?
К.-Майкл Ай
1
@ K.-MichaelAye Отредактированный ответ, но да.
Эллиот Фриш
И этот хак тоже работает. Большое спасибо! (Добавил его в мой .zshrc)
К.-Майкл Ай
3

Если вы используете одинарные кавычки, то это работает:

scp 'remote.host.com:files*' .
Навид Ахмед
источник
Я +1 тебе, так как это было простым исправлением в использовании Cygwin. Благодарность!
Карлос
просто и легко исправить. Благодарность! нет необходимости в дальнейшем крючке.
кейт