Визначте псевдонім і негайно скористайтеся ним


11

У zshцьому чудово працює:

alias foo=ls
foo

Але це не так:

alias foo=ls; foo

Натискання клавіші Enter у додатковий час не є проблемою при інтерактивному запуску. Але при пробігу через 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вони вели себе точно так само. Сподіваюся, хтось міг би це пояснити.
Slyx

Bash - це не проблема: ssh server 'shopt -s expand_aliases; псевдонім jj = ls \ njj'
Ole Tange

Відповіді:


9

Ви не можете цього зробити.

Оскільки псевдоніми були розширені лише після розширення історії, і весь рядок було прочитано за один раз, тож коли fooбуло виконано, процес розширення псевдоніму минув, оболонка пізно пізнати нові псевдоніми.

Найкращий спосіб зробити це визначення псевдоніму .zshrcабо використання функції, такої як відповідь jimmij, або використання eval:

alias foo=ls; eval foo

Існує особливий випадок з zsh -c . У цьому випадку ті псевдоніми, які були визначені в, .zshenvбудуть розширені.


Це не пояснює, чому ssh host 'alias foo=bar<newline>foo'це не працює. Є особливий випадокzsh -c
Стефан Шазелас

Або скористайтесяalias foo=ls; eval foo
Стефан Шазелас

@ StéphaneChazelas: Дякую за інформацію, оновлену разом з ними. Про sshвипадок, чи можете ви зрозуміти, будь ласка. Я думаю, що команду все-таки прочитали за один раз.
cuonglm

10

Це дуже відома проблема, яка навіть описана в zshпосібнику у розділі НАВІДКЛЕННЯ (див. man zshmisc). Рекомендований спосіб поводження з ним полягає у використанні функції замість псевдоніму:

foo() { ls; } ; foo

а ще краще у випадку ls:

foo() { ls -- "${@:-.}"; } ; foo

пс. крапка з комою в кінці визначення функції (списку) та пробілів не потрібна в zsh, але як звичка від інших оболонок я все-таки їх розміщую.


1

Використовуючи c-shell (tcsh, щоб бути точним) з командного рядка:

mymachine % alias showme "echo here it is"
mymachine % showme
here it is

або помістіть його у файл .cshrc, а потім виведіть файл:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.