Shell什麼時候應該使用 subshel l 與
什麼時候應該使用 subshel l 與 xargs
?
許多簡單的命令 using
xargs
可以重寫為使用子shell的命令。例如,這是我今天早些時候使用的東西,用於連接 10 個最大的二進製文件/usr/bin
,使用 subshell vs xargs 編寫:子殼:
$ cat $(du -sh /usr/bin/* | sort -h | tail | cut -d " " -f 2 | tr "\n" " ")
xargs
:$ du -sh /usr/bin/* | sort -h | tail | cut -d " " -f 2 | tr "\n" " " | xargs cat
那麼什麼時候應該使用子shell,什麼時候應該使用
xargs
?筆記:
cut 的分隔符是一個硬製表符,顯然在 SE 上無法正確顯示。
這是一個有點自以為是的問題,但我只想說這個,它高度依賴於兩件事:
- 你要執行的命令是什麼?
- 你要執行多少個實例?
如果您可能會執行數十到數百個相同的過程,那麼
xargs
最有意義。此外,如果這些流程的啟動成本很高,那麼xargs
這可能是最好的選擇。但是,如果只有少數命令實例,那麼在子 shell 中執行它們就可以了。
如果子shell 生成的參數長度非常長,那麼您需要使用
xargs
. 但是這個限制非常極端,通常是 2MB-4MB 的字元,所以你不太可能超過它。你可以這樣檢查:$ xargs --show-limits < /dev/null Your environment variables take up 4805 bytes POSIX upper limit on argument length (this system): 2090299 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we could actually use: 2085494 Size of command buffer we are actually using: 131072
順便說一句,這些命令似乎都不起作用。
cut -d " " -f2
無效,只能cut
以單個字元作為分隔符。試試這個:$ du -sh /usr/bin/* | sort -h | awk 'NR<=10 {print $2}' | tr "\n" " " -or- $ du -sh /usr/bin/* | sort -h | tail | cut -f2- | tr "\n" " "
如果您有任何帶有空格的文件名或目錄,使用
awk
此處可能會導致您出現問題,因此請謹慎使用。$ ll total 0 -rw-rw-r--. 1 saml saml 0 Feb 22 19:47 file 1 -rw-rw-r--. 1 saml saml 0 Feb 22 19:47 file 2 $ du -sh * | sort -h | awk 'NR<=10 {print $2}' | tr "\n" " " file file $
我會使用該
cut -f2-
方法,但這只是我,其他人可能會為您提供更複雜的awk
解決方案,但請使用對您最有意義的方法。使用 awk + 貓
**注意:**當管道輸出
xargs
不需要呼叫cat
時,xargs
預設情況下會自動回顯它傳遞的輸出。$ du -sh * | sort -h | tail | cut -f2- | tr "\n" " " | xargs file 1 file 10 file 2 file 3 file 4 file 5 file 6 file 7 file 8 file 9
編輯#1
如果您使用製表符與 cut 分隔,則不需要明確地這樣做,它預設為。
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter