エイリアスを定義してすぐに使用してください。

エイリアスを定義してすぐに使用してください。

これは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

関連情報