Scroll to navigation

XARGS(1) General Commands Manual XARGS(1)

名稱

xargs - 從標準輸入構建並執行命令列

概述

xargs [選項] [命令 [初始引數]]

描述

本手冊頁記載了 GNU 版本的 xargsxargs 從標準輸入讀取由空白字元或換行符分隔的條目(如需在條目中保留空格,可以使用單引號、雙引號或者反斜線轉義),並且使用給出的 初始引數 以及後續從標準輸入讀取的條目作為引數來執行給定的 命令(預設執行 echo)一次或多次。標準輸入中的空行將被忽略。

程式持續構建給定 命令 的命令列直到遇到了系統定義的限制為止(除非使用了 -n-L 選項)。指定的 命令 會被呼叫多次,直到用盡輸入條目列表項為止。通常情況下,呼叫 命令 的次數要遠少於輸入條目項的數量。這通常可以帶來十分顯著的效能提升。某些命令也可並行執行;請參見 -P選項。

因 Unix 檔名可包含空白和換行符,這樣的預設行為通常會出現問題;含有空白和/或換行符的檔名無法被 xargs 正確處理。在這些場景下,最好應使用 -0 選項來避免這樣的問題。使用該選項時,您應確保生成 xargs 的輸入的程式同樣使用空字元作為分隔符。例如如果使用了 GNU find,則應當選用其 -print0 選項。

如果任何對命令的呼叫返回了 255 狀態碼,xargs 會立刻停止而不再讀取更多的輸入資料。該情況發生時程式會在標準錯誤列印錯誤資訊。

選項

-0, --null
輸入條目以空字元結束,而不是以空白結束,引號和反斜槓也不特殊(每個字元都按字面意思理解)。停用檔案結束字串(EOF),該字串與其他引數按相同方法處理。當輸入項可能包含空白、引號或反斜線時,該選項非常有用。GNU find -print0 選項產生的輸入適合這種模式。

從給定file而不是標準輸入讀取條目。如果使用該選項,執行命令時標準輸入將保持不變。否則,標準輸入將從 /dev/null 重定向。

輸入條目由指定字元分隔而結束。所指定的分隔符可能是單個字元、類似 \n 的 C 風格字元轉義序列、或者八進位制/十六進位制轉義程式碼。八進位制和十六進位制轉義程式碼和 printf 命令所使用的格式一致。不支援多位元組字元。處理輸入時,引號和反斜線並不會被特殊處理;輸入中的每個字元都被按照其字面樣式進行處理。使用 -d 選項會停用所有檔案結束字串,令其與其它引數按照相同方式處理。在輸入僅包含用換行符分隔的條目時可以使用該選項;但如果可能的話,設計讓程式使用 --null 選項幾乎總是更好的方案。

將檔案結束字串設定為 eof-str。如果該檔案結束字串作為一行輸入出現,則其後的輸入內容均會被忽略。如果既未使用 -E 也未使用 -e,則不使用任何檔案結束字串。
該選項是 -E 選項的同義詞。請使用 -E ,因為它符合 POSIX 標準,而該選項不符合 POSIX 標準。如果省略 eof-str ,則沒有檔案結束字串。如果既沒有使用 -E 也沒有使用 -e,則不會使用檔案結尾字串。
將給定初始引數中出現的替換佔位字串替換為從標準輸入中讀取得到的字串。另外,未被引號包括的空白字元不會被視為輸入專案的分隔符;此時分隔符是換行符。該選項隱含啟用了 -x-L 1 選項。
如果給出了替換佔位字串,則該選項和 -I替換佔位字串同義。如果缺失了替換佔位字串,則其效果等同於 -I{}。-i 已被棄用,請改用 -I
每個命令列使用至多最大行數個非空輸入行。行末尾的空白字元會使得下一行成為上一行邏輯上的延續。隱含啟用 -x
-L 選項同義。但與 -L 不同,此時最大行數的引數是可選的。如果未指定最大行數,則預設取值為 1。-l 選項已被棄用,因為 POSIX 標準指定了使用 -L 選項。
每條命令列最多使用 max-args 個引數。如果引數總大小超過限制(參見 -s 選項),則實際使用的引數數量可能少於 max-args,除非指定了 -x 選項;在這種情況下,xargs 將直接退出。
同時最多執行 max-procs 個程序;預設值為 1。如果 max-procs 為 0,則 xargs 會盡可能多地同時執行程序。應當配合 -n 選項或 -L 選項與 -P 一起使用;否則很可能只執行一次 exec。在 xargs 執行期間,你可以向其程序傳送 SIGUSR1 訊號來增加並行執行的命令數,或傳送 SIGUSR2 訊號來減少該數量。增加數量時不能超過實現定義的上限(可透過 --show-limits 檢視),減少數量時不能低於 1。xargs 永遠不會主動終止其啟動的命令;當請求減少併發數時,它只會在已有的多個命令終止之後才啟動新的。xargs 在退出前總是會等待所有子程序結束(但有例外,請參見本文件“缺陷”一節)。

如果未使用 -P 選項,xargs 將不會處理 SIGUSR1 和 SIGUSR2 訊號,這意味著這些訊號將會終止該程式(除非在啟動 xargs 之前,這些訊號已在父程序中被遮蔽)。

請注意,被呼叫的程序需自行負責正確管理對共享資源的併發訪問。例如,如果多個程序同時嘗試向標準輸出列印內容,除非它們以某種方式進行協作防止衝突,否則輸出的順序將無法確定(並且很可能會混雜在一起)。採用某種鎖機制是一種防止此類問題的方法。一般而言,使用鎖機制有助於確保輸出正確,但會降低效能。如果你不希望承受效能差異的影響,可以讓每個程序輸出到不同的檔案,或者以其他方式使用不同的資源。

在執行命令之前,在子程序中將標準輸入重新開啟為 /dev/tty。如果你希望 xargs 執行一個互動式應用程式,這將非常有用。
在執行每條命令列之前提示使用者確認,並從終端讀取一行輸入。僅當用戶的響應以“y”或“Y”開頭時才執行該命令列。此選項隱含啟用 -t
將環境變數 name 設定為每個正在執行的子程序中的唯一值。一旦子程序退出,該值會被重新使用。例如,這可以用於實現一個基本的負載分配方案。
如果標準輸入中不包含任何非空白字元,則不執行命令。通常情況下,即使沒有輸入,命令也會執行一次。此選項是 GNU 擴充套件功能。
每條命令列最多使用 max-chars 個字元,包括命令本身、初始引數以及每個引數字串末尾的空字元。最大允許值依賴於系統,其計算方式為:exec 的引數長度限制,減去環境變數所佔空間,再減去 2048 位元組的保留空間。如果計算出的值超過 128 KiB,則預設值為 128 KiB;否則,預設值為該最大值。其中 1 KiB 等於 1024 位元組。xargs 會自動適應更嚴格的限制。
顯示作業系統施加的命令列長度限制、xargs 所選擇的緩衝區大小,以及 -s 選項所設定的限制。如果你不希望 xargs 實際執行任何操作,可以將輸入透過管道重定向為來自 /dev/null(並可考慮加上 --no-run-if-empty 選項)。
在執行命令之前,將該命令列列印到標準錯誤輸出上。
如果大小超出限制(參見 -s 選項),則退出程式。
--
用於標記選項列表的結束。其後的引數(如果有)即使以 - 開頭,也會被當作運算元處理。例如,xargs -- --help 會執行 PATH 中名為 --help 的命令,而不是列印用法說明;xargs -- --mycommand 會執行命令 --mycommand,而不會將其視為無法識別的選項而報錯。
列印 xargs 的選項摘要並退出。
列印 xargs 的版本號並退出。

選項 --max-lines-L-l)、--replace-I-i)以及 --max-args-n)是互斥的。如果同時指定了其中多個選項,xargs 通常會採用命令列中最後指定的選項,也就是說,之前指定的衝突選項會被重置為預設值。此外,xargs 會在 stderr 上發出警告資訊。此規則有一個例外:當使用 --replace 或其別名 -I-i 後,若再次指定特殊值 1(即 '-n1'),該值將被忽略,因為它實際上並不構成衝突。

示例

find /tmp -name core -type f -print | xargs /bin/rm -f

/tmp 目錄中或其子目錄下查詢名為 core 的檔案並將其刪除。請注意,如果有任何檔名中包含換行符或空格,該操作可能無法正確執行。

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

/tmp 目錄中或其子目錄下查詢名為 core 的檔案並將其刪除,處理檔名時會正確處理包含空格或換行符的檔案或目錄名稱。

find /tmp -depth -name core -type f -delete

/tmp 目錄中或其子目錄下查詢名為 core 的檔案並將其刪除,且比前一個示例更高效(因為我們避免了使用 fork(2)exec(2) 來啟動 rm,也不需要額外的 xargs 程序)。

cut -d: -f1 < /etc/passwd | sort | xargs echo
生成系統上所有使用者的簡潔列表。

退出狀態

xargs 退出時會使用下列狀態碼:

0
表示執行成功
123
表示所呼叫的命令中出現了退出狀態碼在 1–125 範圍內的情況
124
表示命令以 255 退出
125
表示命令被訊號殺死
126
表示無法執行命令
127
表示命令未找到
1
表示出現了其他錯誤。

大於 128 的退出狀態碼通常由 shell 所使用,指示程式由於某個致命訊號而停止。

遵循標準

截至 GNU xargs 第 4.2.9 版,xargs 的預設行為是不適用邏輯上的檔案結束標記。POSIX (IEEE Std 1003.1, 2004 版) 允許該行為。

-l 和 -i 選項在 POSIX 標準的 1997 版出現,但在 2004 版中未出現。因此最好應使用 -L 和 -I 進行替代。

-o 選項是 POSIX 標準中為了加強與 BSD 的相容性而出現的擴充套件。

POSIX 標準允許具體實現設定 exec 函式的引數大小限制。包含環境在內,其限制最小可以低至 4096 位元組。如需編寫可移植指令碼,指令碼不能假定更大的限制值。然而,筆者至今未曾見到最大值限制如此低的實現版本。可以使用 --show-limits 選項檢查當前系統上生效的實際限制值。

xargs 4.9.0 版和之前版本中,即便未使用 -P 選項,SIGUSR1 和 SIGUSR2 也不會導致 xargs 終止執行。

歷史

xargs 程式由貝爾實驗室的 Herb Gellis 所發明。請參見 findutils 的 texinfo 手冊中 Finding Files 一節以瞭解更多資訊。

缺陷

無法保證 xargs 能夠完全安全地執行,因為在產生輸入檔案的列表和其被 xargs 執行的命令所處理這兩個事件之間總有時間差。如果有其他使用者同時在訪問系統,他們可以在這個時間視窗內操作檔案系統並迫使 xargs 要執行的命令本來要處理的檔案和實際處理的檔案不相同。如需瞭解對這個問題和相關問題更詳細的討論,請參考 findutils Texinfo 文件中的“Security Considerations”章節。find 工具的 -execdir 選項通常可以被用來提供更為安全的功能替代。

在使用 -I 選項時,從輸入讀取的每一行都會儲存在內部緩衝區。這意味著使用 -I 選項時 xargs 能接受的輸入行數存在上限。如需繞過這個限制,可以使用 -s 選項來加大 xargs 所使用的緩衝區大小,且另外也可以使用多次額外的 xargs 呼叫來確保不會出現超長的行。例如:

某些命令 | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}'

在這裡,第一次呼叫的 xargs 因為未使用 -i 選項而沒有輸入行長度限制。第二次呼叫的 xargs 確實存在限制,但我們已確保了它永遠不會遇到超出其處理能力範圍的行。這並不是最理想的解決方法。理想情況下,-i 選項不應該預設行長度限制,這也是本段討論會出現在“缺陷”一節中的原因。這個問題在處理 find(1) 的輸出時並不會出現,因其每行只會輸出一個檔名。

xargs 4.9.0 版本及之前的版本中,xargs -P 在其子程序仍在執行,但其中某些已經返回 255 的情況下會退出。

報告缺陷

GNU findutils 線上幫助:<https://www.gnu.org/software/findutils/#get-help>
請向 <https://translationproject.org/team/zh_CN.html> 報告翻譯錯誤。

請使用 GNU Savannah 缺陷追蹤系統上的表格報告任何出現的問題:

有關 GNU findutils 軟體包的通用主題可以在 bug-findutils 郵件列表上討論:

版權

版權所有 © 1990–2024 自由軟體基金會。許可證 GPLv3+:GNU GPL 第 3 版或更新版本 <https://gnu.org/licenses/gpl.html>。
這是自由軟體:您可以自由地更改並對其重新發布。在法律所允許的範圍內不含任何擔保。

參見

find(1), kill(1), locate(1), updatedb(1), fork(2), execvp(3), locatedb(5), signal(7)

完整文件 <https://www.gnu.org/software/findutils/xargs>
或者在本地使用:info xargs

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh