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


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エイリアスがアクティブであることをどのようにしてわかりますか?


これはエイリアシングの一般的な問題です。私はそれを使ってそれを試しましたbashcshそして彼らは同じように振舞いました。誰かがそれを説明してくれることを願っています。
Slyx

bashは問題ではありません:sshサーバー 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole

回答:


9

できません。

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

あなたができる最善の方法は、中にエイリアスを定義している.zshrcかのような機能を使用してjimmijの答えや使用しますeval

alias foo=ls; eval foo

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


それはなぜssh host 'alias foo=bar<newline>foo'動作しないのか説明しません。以下のための特別なケースがありますzsh -c
ステファンChazelas

または使用alias foo=ls; eval foo
ステファンChazelas

@StéphaneChazelas:更新された情報に感謝します。sshケースについて、もっと明確にしていただけませんか。コマンドは一気に読まれたと思います。
cuonglm 2015

10

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

foo() { ls; } ; foo

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

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

ps。関数定義(リスト)の最後のセミコロンとスペースは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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.