.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に感謝します)
cmd
別のエイリアスに「コマンド」プレフィックスを追加してください。alias other-cmd-alias='command cmd --other-stuff'
または、
- 同様に、バックスラッシュの接頭辞を追加して別のエイリアス内のエイリアスをエスケープできます(たとえば、コマンドラインでもこれを実行できます)
alias other-cmd-alias='\cmd --other-stuff'
。
ベストアンサー1
Bashはエイリアスにエイリアスを含めることができますが、無限ループに対する保護機能が組み込まれています。あなたの場合を入力すると、lsc
bashはまずエイリアスを次のように拡張します。
ls -Flatr --color=always
ls
エイリアスでもあるため、bashはこれを次のように拡張します。
lsc -Flatr --color=always
lsc
エイリアスですが、賢明には、bashはエイリアスに拡張することを拒否します。第二。というプログラムがある場合、lsc
bashはそのプログラムを実行します。しかし、いいえ、だからあなたはcommand not found
。
付録
走っているときは異なりますlscR
。 lscR
拡張:
ls -FlatrR --color=always
ls
エイリアスなので、次に展開されます。
lsc -FlatrR --color=always
lsc
エイリアスなので、次に展開されます。
ls -Flatr --color=always -FlatrR --color=always
ls
bashはすでに一度拡張されているため、拡張を拒否します。第二。という実際の命令があるので、ls
この命令を実行する。
歴史
指摘したとおりヒリーコメントでは、bashはエイリアスを再拡張しないという概念を借りています。ケシ。
横に
エイリアスは便利ですが、それほど強力ではありません。パラメータ置換などの複雑な操作を実行するためにエイリアスを使用したい場合は、代わりにシェル関数を使用しないでください。