コマンドA
とコマンドがありますが、入力したとおりに実行したいB
とし、その逆の場合も同じだとしましょう。頑張ったB
A
alias A='B'
alias B='A'
しかし、これは何らかの理由で動作しないようです。
どうすればいいですか?
編集する:
コマンドは実際にはmyB
で関数として定義されているので.bashrc
alias A='command B'
alias B='command A'
提案どおりに動作しません。
私はthisを指定するように質問を更新するか、bashで定義された関数であると思いましA
たB
。
答え1
したがって、シェルがコマンドを検索する方法を明示的に確認する方法はいくつかあります。あなたはそれを使用することができます...
command command_name
...シェルに呼び出しのみを指示します。コマンド名$PATH
実行可能ファイルの場合。これはあなたのような場合に重要です。なぜなら、作業が完了すると通常、拡張が繰り返しを止めるまでに20回かかりalias A
始めたalias B
ところに戻るからです。呼び出されたときにのみd実行可能ファイルを呼び出し、その逆も同様であれば、次のようにすることができます。alias A
alias
$PATH
B
A
alias A='command B' B='command A'
A
...これは、名前付き関数を呼び出すことを避けるべきですB
。それ以外の場合 - シェルは参照を拡張しませんが、alias
まだalias
関数を呼び出すためです。コマンド名引用するには、例えば定義から引用することがA
できます。B
alias A=\\B B=\\A
いいですね。これは20回繰り返されません。どこかでこの記事を読んだと誓うかもしれませんが、man
少なくとも両方は本当bash
ではないようです。ksh
(今までそのうちの1つだけをテストしました)。実際には2回だけ繰り返されます。
n=0
A(){ echo not B; n=0; }
B(){ echo not A; n=0; }
alias A='echo "$((n+=1))";B' B='echo "$((n+=1))";A'
上記のようにすると...
A
...bash
以下を印刷します。
1
2
not B
私はこれがマニュアルの内容に関連していると思いますbash
。
- 代替テキストの最初の単語はエイリアスがあるかどうかをテストしますが、拡張する単語と同じエイリアスを持つ単語は再び拡張されません。これは、例えばエイリアスを指定することができ、
ls
代替テキストを再帰的に拡張しようとしないことを意味します。ls -F
bash
私はこれを以前読みましたが、これを行うときに現在の拡張につながるすべての拡張をテストするわけではないと思います。チェーンの最新の拡張にのみ適用されるようです。まぁそんな理由のようです。
しかし、いくつかの興味深い動作を発見しました。エイリアスと関数を宣言した後、次のようにコマンドを再実行しましたが、その間にスペースが少なくなりました。
A(){ echo not B; }; B(){ echo not A; }; A; B
...本当です...
1
2
3
4
5
6
not B
7
8
not A
これは、シェルが関数名をエイリアスの内容に置き換えることを意味します。これは通常、拡張が発生すると予想される場所ではありませんecho
。まだ関数をオーバーライドして実行します。