Shell

什麼時候應該使用 subshel l 與 xargs

  • February 23, 2014

許多簡單的命令 usingxargs可以重寫為使用子shell的命令。例如,這是我今天早些時候使用的東西,用於連接 10 個最大的二進製文件/usr/bin,使用 subshel​​l 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 上無法正確顯示。

這是一個有點自以為是的問題,但我只想說這個,它高度依賴於兩件事:

  1. 你要執行的命令是什麼?
  2. 你要執行多少個實例?

如果您可能會執行數十到數百個相同的過程,那麼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

引用自:https://unix.stackexchange.com/questions/116456