Bash エイリアス - 優先順位 /hide (/hide/fail)

Bash エイリアス - 優先順位 /hide (/hide/fail)

.bashrcにはいくつかのエイリアス設定があります(この順番で)。

alias ls="lsc"
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

購入後の確認alias

alias ls='lsc'
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

新しいエイリアスをうまく実行できますls。 lsc エイリアスに接続し、lsc エイリアスに関連するコマンドを実行します。私も走ることができ、lscR期待どおりに動作します。

lsc直接実行しようとすると、次の結果が表示されます。

$ lsc
lsc: command not found

この場合、シェルがlscエイリアスを非表示または非表示にするように見える理由をご存知ですか? (同じ結果を得るために「ls」を実行できますが、「lsc」を実行することは意味がありませんが、この場合はシェルの動作を理解しようとしています。)

編集:以下の質問に対する回答として提供される(bash)シェルの動作の回避策です。

元の質問に非常に便利な答えを提供しました。回答で説明されている拡張動作を短絡するには、2番目のエイリアスを防ぐ方法が2つ以上あるようです。つまり、すでにエイリアスを使用しているコマンドを拡張しようとします。たとえば、alias cmd='cmd --stuff'名前がオーバーライドされた基本コマンドがある場合は、cmd「cmd」エイリアスがcmd別のエイリアスのデフォルトコマンドの代わりに使用されるのを防ぐことができます。

(最初のアプローチについてコメントしてくれたwjandreaに感謝します)

  1. cmd別のエイリアスに「コマンド」プレフィックスを追加してください。alias other-cmd-alias='command cmd --other-stuff'

または、

  1. 同様に、バックスラッシュの接頭辞を追加して別のエイリアス内のエイリアスをエスケープできます(たとえば、コマンドラインでもこれを実行できます)alias other-cmd-alias='\cmd --other-stuff'

ベストアンサー1

Bashはエイリアスにエイリアスを含めることができますが、無限ループに対する保護機能が組み込まれています。あなたの場合を入力すると、lscbashはまずエイリアスを次のように拡張します。

ls -Flatr --color=always

lsエイリアスでもあるため、bashはこれを次のように拡張します。

lsc -Flatr --color=always

lscエイリアスですが、賢明には、bashはエイリアスに拡張することを拒否します。第二。というプログラムがある場合、lscbashはそのプログラムを実行します。しかし、いいえ、だからあなたはcommand not found

付録

走っているときは異なりますlscRlscR拡張:

ls -FlatrR --color=always

lsエイリアスなので、次に展開されます。

lsc -FlatrR --color=always

lscエイリアスなので、次に展開されます。

ls -Flatr --color=always -FlatrR --color=always

lsbashはすでに一度拡張されているため、拡張を拒否します。第二。という実際の命令があるので、lsこの命令を実行する。

歴史

指摘したとおりヒリーコメントでは、bashはエイリアスを再拡張しないという概念を借りています。ケシ

横に

エイリアスは便利ですが、それほど強力ではありません。パラメータ置換などの複雑な操作を実行するためにエイリアスを使用したい場合は、代わりにシェル関数を使用しないでください。

おすすめ記事