| XARGS(1) | General Commands Manual | XARGS(1) |
xargs - 從標準輸入構建並執行命令列
xargs [選項] [命令 [初始引數]]
本手冊頁記載了 GNU 版本的 xargs。xargs 從標準輸入讀取由空白字元或換行符分隔的條目(如需在條目中保留空格,可以使用單引號、雙引號或者反斜線轉義),並且使用給出的 初始引數 以及後續從標準輸入讀取的條目作為引數來執行給定的 命令(預設執行 echo)一次或多次。標準輸入中的空行將被忽略。
程式持續構建給定 命令 的命令列直到遇到了系統定義的限制為止(除非使用了 -n 和 -L 選項)。指定的 命令 會被呼叫多次,直到用盡輸入條目列表項為止。通常情況下,呼叫 命令 的次數要遠少於輸入條目項的數量。這通常可以帶來十分顯著的效能提升。某些命令也可並行執行;請參見 -P選項。
因 Unix 檔名可包含空白和換行符,這樣的預設行為通常會出現問題;含有空白和/或換行符的檔名無法被 xargs 正確處理。在這些場景下,最好應使用 -0 選項來避免這樣的問題。使用該選項時,您應確保生成 xargs 的輸入的程式同樣使用空字元作為分隔符。例如如果使用了 GNU find,則應當選用其 -print0 選項。
如果任何對命令的呼叫返回了 255 狀態碼,xargs 會立刻停止而不再讀取更多的輸入資料。該情況發生時程式會在標準錯誤列印錯誤資訊。
如果未使用 -P 選項,xargs 將不會處理 SIGUSR1 和 SIGUSR2 訊號,這意味著這些訊號將會終止該程式(除非在啟動 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 退出時會使用下列狀態碼:
大於 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 缺陷追蹤系統上的表格報告任何出現的問題:
版權所有 © 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