web-dev-qa-db-ja.com

エイリアスを定義してすぐに使用する

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にどのように伝えますか?

11
Ole Tange

あなたはそれをすることはできません。

エイリアスは履歴拡張後にのみ拡張され、行全体が一度に読み取られたため、fooが実行されたときにエイリアス拡張プロセスが終了し、シェルが新しいエイリアスを認識するのは遅すぎます。

最善の方法は、.zshrcでエイリアスを定義するか、 jimmijの回答 のような関数を使用するか、evalを使用することです。

alias foo=ls; eval foo

zsh -cの特別な場合 があります。この場合、.zshenvで定義されたエイリアスが展開されます。

9
cuonglm

これは非常によく知られている問題であり、zshマニュアルのALIASINGの章にも記載されています(man zshmiscを参照)。これに対処するための推奨される方法は、エイリアスの代わりに関数を使用することです。

foo() { ls; } ; foo

またはlsの場合はさらに良い:

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

ps。関数定義(リスト)の最後のセミコロンとスペースはzshでは必要ありませんが、他のシェルの習慣として、私はまだそれらを置いています。

10
jimmij

コマンドラインから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
1
user3227618