В zsh
этом все отлично работает:
alias foo=ls
foo
Но это не так:
alias foo=ls; foo
Нажатие ввода дополнительное время не является проблемой при работе в интерактивном режиме. Но когда пробег через ssh
это внезапно становится проблемой:
% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo
Даже с новой строкой это не работает:
% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo
Странная вещь в том, что zsh
знает, что это псевдоним:
% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence
Как сказать, zsh
что псевдонимы должны быть активными?
bash
иcsh
они вели себя так же. Я надеюсь, что кто-то может объяснить это.Ответы:
Ты не можешь сделать это.
Поскольку псевдонимы были развернуты только после раскрытия истории, и вся строка была прочитана за один раз, поэтому, когда он
foo
был выполнен, процесс раскрытия псевдонимов завершился, оболочке уже слишком поздно распознавать новый псевдоним.Лучший способ сделать это - определить псевдоним
.zshrc
или использовать функцию, например , ответ jimmij или использоватьeval
:Есть особый случай с zsh -c . В этом случае те псевдонимы, которые были определены в,
.zshenv
будут расширены.источник
ssh host 'alias foo=bar<newline>foo'
не работает. Есть специальный случай дляzsh -c
alias foo=ls; eval foo
ssh
случае, не могли бы вы сделать это более ясным. Я думаю, что команда все еще была прочитана за один раз.Это очень известная проблема, которая даже описана в
zsh
руководстве под заголовком ALIASING (см.man zshmisc
). Рекомендуемый способ борьбы с ним - использовать функцию вместо псевдонима:или даже лучше в случае
ls
:пс. точка с запятой в конце определения функции (список) и пробелы в zsh не нужны, но по привычке из других оболочек я их все равно ставлю.
источник
Используя c-shell (точнее tcsh) из командной строки:
или поместите его в файл .cshrc, затем отправьте файл:
источник