為什麼這個指令不能當別名?

為什麼這個指令不能當別名?

我一直在使用以下命令列出當前目錄下任意深度的十個最大檔案:

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

(我用awk代替來head防止管道破裂錯誤當列表太長時)

它運作良好,但顯然很難每次都記住和打字。我嘗試將其放入 .bash_aliases 中,但它不起作用(它會列印 10 個空白行)。

如果我使用less而不是awk,輸出會正確顯示,但這意味著顯示大於 10MB(我的下閾值)的整個文件列表,按大小排序,而不是僅顯示頂部的文件。

那麼,是什麼讓awkchoke 作為別名命令的一部分(假設這確實是問題),我能做些什麼來解決它?

答案1

使用此命令作為別名時,$0不再受單引號保護,因此將轉換為您的 shell 名稱。這些命令演示了這一點:

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

shell 名稱(大概bash)剛好是未設定的awk變數名,導致空白行。

防止 shell 擴展的一種方法$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

相關內容