これは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
エイリアスを有効にする必要があるかどうかはどうすればわかりますか?
答え1
これはよく知られている問題であり、zsh
マニュアルの「Alias」の章にも記載されています(参考資料を参照man zshmisc
)。これを処理するための推奨される方法は、エイリアスの代わりに関数を使用することです。
foo() { ls; } ; foo
または、次の場合にはより良いですls
。
foo() { ls -- "${@:-.}"; } ; foo
PS。関数定義(リスト)の末尾にあるセミコロンとスペースはzshでは必要ありませんが、他のシェルではまだ習慣的に使用されます。
答え2
できません。
エイリアスは履歴拡張後に拡張され、行全体を一度に読み取るため、foo
実行するとエイリアス拡張プロセスが消え、シェルが新しいエイリアスを認識するには遅すぎます。
あなたができる最善の方法は、エイリアスを定義するか、.zshrc
次の関数を使用することです。ジミーの答えまたは以下を使用してくださいeval
。
alias foo=ls; eval foo
一つあるzsh -cの特殊ケース。この場合、定義されたエイリアスが.zshenv
拡張されます。
答え3
コマンドラインで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