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
にどのように伝えますか?
あなたはそれをすることはできません。
エイリアスは履歴拡張後にのみ拡張され、行全体が一度に読み取られたため、foo
が実行されたときにエイリアス拡張プロセスが終了し、シェルが新しいエイリアスを認識するのは遅すぎます。
最善の方法は、.zshrc
でエイリアスを定義するか、 jimmijの回答 のような関数を使用するか、eval
を使用することです。
alias foo=ls; eval foo
zsh -cの特別な場合 があります。この場合、.zshenv
で定義されたエイリアスが展開されます。
これは非常によく知られている問題であり、zsh
マニュアルのALIASINGの章にも記載されています(man zshmisc
を参照)。これに対処するための推奨される方法は、エイリアスの代わりに関数を使用することです。
foo() { ls; } ; foo
またはls
の場合はさらに良い:
foo() { ls -- "${@:-.}"; } ; foo
ps。関数定義(リスト)の最後のセミコロンとスペースはzshでは必要ありませんが、他のシェルの習慣として、私はまだそれらを置いています。
コマンドラインから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