このコマンドがエイリアスとして機能しないのはなぜですか?

このコマンドがエイリアスとして機能しないのはなぜですか?

私は次のコマンドを使用して、現在のディレクトリの下にある任意の深さで最大の 10 個のファイルを一覧表示しています。

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'

(私はのawk代わりにを使っています。headパイプ破損エラーリストが長すぎる場合

うまく機能しますが、毎回覚えて入力するのは明らかに困難です。これを .bash_aliases に入れてみましたが、機能しません (10 行の空行が出力されます)。

lessの代わりにを使用するとawk、出力は正しく表示されますが、上位のファイルだけでなく、10MB (下限値) より大きいファイルのリスト全体がサイズ順に表示されてしまいます。

では、エイリアス コマンドの一部として choke が実行される原因は何でしょうかawk(それが実際に問題であると仮定した場合)。また、これを修正するにはどうすればよいでしょうか。

答え1

このコマンドをエイリアスとして使用すると、$0単一引用符で保護されなくなり、シェル名に変換されます。次のコマンドはそれを示しています。

$ alias F="echo '$0'"      
$ F
bash

シェル名(おそらくbash)は未設定ですawk変数名、空行につながります。

シェルの拡張から保護する 1 つの方法は、$0次のようなものを使用することです。

alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"

ただし、これは$0役に立たないので、ステートメントから削除することができますawk

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'

awk選択した行を印刷するのはデフォルトの動作なので、さらに進んでブロック全体を削除することもできます。

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'

あるいは、headエラー メッセージを破棄してそのまま使い続けることもできます。

find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head

関連情報