.\" -*- nroff -*- .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XARGS 1 .SH 名稱 xargs \- 從標準輸入構建並執行命令列 .SH 概述 \fBxargs\fP .nh [\fI選項\fP] [\fI命令\fP [\fI初始引數\fP]] .hy . .SH 描述 本手冊頁記載了 GNU 版本的 \fBxargs\fP。\fBxargs\fP 從標準輸入讀取由空白字元或換行符分隔的條目(如需在條目中保留空格,可以使用單引號、雙引號或者反斜線轉義),並且使用給出的 \fI初始引數\fP 以及後續從標準輸入讀取的條目作為引數來執行給定的 \fI命令\fP(預設執行 \fIecho\fP)一次或多次。標準輸入中的空行將被忽略。 .P 程式持續構建給定 \fI命令\fP 的命令列直到遇到了系統定義的限制為止(除非使用了 \fB\-n\fP 和 \fB\-L\fP 選項)。指定的 \fI命令\fP 會被呼叫多次,直到用盡輸入條目列表項為止。通常情況下,呼叫 \fI命令\fP 的次數要遠少於輸入條目項的數量。這通常可以帶來十分顯著的效能提升。某些命令也可並行執行;請參見 \fB\-P\fP選項。 .P 因 Unix 檔名可包含空白和換行符,這樣的預設行為通常會出現問題;含有空白和/或換行符的檔名無法被 \fBxargs\fP 正確處理。在這些場景下,最好應使用 \fB\-0\fP 選項來避免這樣的問題。使用該選項時,您應確保生成 \fBxargs\fP 的輸入的程式同樣使用空字元作為分隔符。例如如果使用了 GNU \fBfind\fP,則應當選用其 \fB\-print0\fP 選項。 .P 如果任何對命令的呼叫返回了 255 狀態碼,\fBxargs\fP 會立刻停止而不再讀取更多的輸入資料。該情況發生時程式會在標準錯誤列印錯誤資訊。 . .SH 選項 .TP \fB\-0, \-\-null\fP 輸入條目以空字元結束,而不是以空白結束,引號和反斜槓也不特殊(每個字元都按字面意思理解)。停用檔案結束字串(EOF),該字串與其他引數按相同方法處理。當輸入項可能包含空白、引號或反斜線時,該選項非常有用。GNU find \-print0 選項產生的輸入適合這種模式。 .TP \fB\-a \fP\fI檔案\fP\fB, \-\-arg\-file=\fP\fI檔案\fP 從給定\fIfile\fP而不是標準輸入讀取條目。如果使用該選項,執行命令時標準輸入將保持不變。否則,標準輸入將從 \fI/dev/null\fP 重定向。 .TP \fB\-\-delimiter=\fP\fI分隔符\fP\fB, \-d\fP\fI 分隔符\fP 輸入條目由指定字元分隔而結束。所指定的分隔符可能是單個字元、類似 \fB\en\fP 的 C 風格字元轉義序列、或者八進位制/十六進位制轉義程式碼。八進位制和十六進位制轉義程式碼和 \fBprintf\fP 命令所使用的格式一致。不支援多位元組字元。處理輸入時,引號和反斜線並不會被特殊處理;輸入中的每個字元都被按照其字面樣式進行處理。使用 \fB\-d\fP 選項會停用所有檔案結束字串,令其與其它引數按照相同方式處理。在輸入僅包含用換行符分隔的條目時可以使用該選項;但如果可能的話,設計讓程式使用 \fB\-\-null\fP 選項幾乎總是更好的方案。 .TP \fB\-E\fP\fI eof\-str\fP 將檔案結束字串設定為 \fIeof\-str\fP。如果該檔案結束字串作為一行輸入出現,則其後的輸入內容均會被忽略。如果既未使用 \fB\-E\fP 也未使用 \fB\-e\fP,則不使用任何檔案結束字串。 .TP \fB\-e\fP[\fIeof\-str\fP], \fB\-\-eof\fP[\fI=eof\-str\fP] 該選項是 \fB\-E\fP 選項的同義詞。請使用 \fB\-E\fP ,因為它符合 POSIX 標準,而該選項不符合 POSIX 標準。如果省略 \fIeof\-str\fP ,則沒有檔案結束字串。如果既沒有使用 \fB\-E\fP 也沒有使用 \fB\-e\fP,則不會使用檔案結尾字串。 .TP \fB\-I\fP\fI 替換佔位字串\fP 將給定初始引數中出現的\fI替換佔位字串\fP替換為從標準輸入中讀取得到的字串。另外,未被引號包括的空白字元不會被視為輸入專案的分隔符;此時分隔符是換行符。該選項隱含啟用了 \fB\-x\fP 和 \fB\-L\fP 1 選項。 .TP \fB\-i\fP[\fI替換佔位字串\fP], \fB\-\-replace\fP[\fI=替換佔位字串\fP] 如果給出了\fI替換佔位字串\fP,則該選項和 \fB\-I\fP\fI替換佔位字串\fP同義。如果缺失了\fI替換佔位字串\fP,則其效果等同於 \fB\-I\fP{}。\fB\-i\fP 已被棄用,請改用 \fB\-I\fP。 .TP \fB\-L\fP\fI 最大行數\fP 每個命令列使用至多\fI最大行數\fP個非空輸入行。行末尾的空白字元會使得下一行成為上一行邏輯上的延續。隱含啟用 \fB\-x\fP。 .TP \fB\-l\fP[\fI最大行數\fP], \fB\-\-max\-lines\fP[=\fI最大行數\fP] 和 \fB\-L\fP 選項同義。但與 \fB\-L\fP 不同,此時\fI最大行數\fP的引數是可選的。如果未指定\fI最大行數\fP,則預設取值為 1。\fB\-l\fP 選項已被棄用,因為 POSIX 標準指定了使用 \fB\-L\fP 選項。 .TP \fB\-n\fP\fI max\-args\fP, \fB\-\-max\-args\fP=\fImax\-args\fP 每條命令列最多使用 \fImax\-args\fP 個引數。如果引數總大小超過限制(參見 \fB\-s\fP 選項),則實際使用的引數數量可能少於 \fImax\-args\fP,除非指定了 \fB\-x\fP 選項;在這種情況下,\fBxargs\fP 將直接退出。 .TP \fB\-P\fP\fI max\-procs\fP, \fB\-\-max\-procs\fP=\fImax\-procs\fP 同時最多執行 \fImax\-procs\fP 個程序;預設值為 1。如果 \fImax\-procs\fP 為 0,則 \fBxargs\fP 會盡可能多地同時執行程序。應當配合 \fB\-n\fP 選項或 \fB\-L\fP 選項與 \fB\-P\fP 一起使用;否則很可能只執行一次 exec。在 \fBxargs\fP 執行期間,你可以向其程序傳送 SIGUSR1 訊號來增加並行執行的命令數,或傳送 SIGUSR2 訊號來減少該數量。增加數量時不能超過實現定義的上限(可通過 \-\-show\-limits 檢視),減少數量時不能低於 1。\fBxargs\fP 永遠不會主動終止其啟動的命令;當請求減少併發數時,它只會在已有的多個命令終止之後才啟動新的。\fBxargs\fP 在退出前總是會等待所有子程序結束(但有例外,請參見本文件“缺陷”一節)。 如果未使用 \fB\-P\fP 選項,\fBxargs\fP 將不會處理 SIGUSR1 和 SIGUSR2 訊號,這意味著這些訊號將會終止該程式(除非在啟動 \fBxargs\fP 之前,這些訊號已在父程序中被遮蔽)。 \fB請注意\fP,被呼叫的程序需自行負責正確管理對共享資源的併發訪問。例如,如果多個程序同時嘗試向標準輸出列印內容,除非它們以某種方式進行協作防止衝突,否則輸出的順序將無法確定(並且很可能會混雜在一起)。採用某種鎖機制是一種防止此類問題的方法。一般而言,使用鎖機制有助於確保輸出正確,但會降低效能。如果你不希望承受效能差異的影響,可以讓每個程序輸出到不同的檔案,或者以其他方式使用不同的資源。 .TP \fB\-o, \-\-open\-tty\fP 在執行命令之前,在子程序中將標準輸入重新開啟為 \fI/dev/tty\fP。如果你希望 \fBxargs\fP 執行一個互動式應用程式,這將非常有用。 .TP \fB\-p, \-\-interactive\fP 在執行每條命令列之前提示使用者確認,並從終端讀取一行輸入。僅當用戶的響應以“y”或“Y”開頭時才執行該命令列。此選項隱含啟用 \fB\-t\fP。 .TP \fB\-\-process\-slot\-var\fP=\fIname\fP 將環境變數 \fIname\fP 設定為每個正在執行的子程序中的唯一值。一旦子程序退出,該值會被重新使用。例如,這可以用於實現一個基本的負載分配方案。 .TP \fB\-r, \-\-no\-run\-if\-empty\fP 如果標準輸入中不包含任何非空白字元,則不執行命令。通常情況下,即使沒有輸入,命令也會執行一次。此選項是 GNU 擴充套件功能。 .TP \fB\-s\fP\fI max\-chars\fP, \fB\-\-max\-chars\fP\fI=max\-chars\fP 每條命令列最多使用 \fImax\-chars\fP 個字元,包括命令本身、初始引數以及每個引數字串末尾的空字元。最大允許值依賴於系統,其計算方式為:exec 的引數長度限制,減去環境變數所佔空間,再減去 2048 位元組的保留空間。如果計算出的值超過 128\ KiB,則預設值為 128\ KiB;否則,預設值為該最大值。其中 1\ KiB 等於 1024 位元組。\fBxargs\fP 會自動適應更嚴格的限制。 .TP \fB\-\-show\-limits\fP 顯示作業系統施加的命令列長度限制、\fBxargs\fP 所選擇的緩衝區大小,以及 \fB\-s\fP 選項所設定的限制。如果你不希望 \fBxargs\fP 實際執行任何操作,可以將輸入通過管道重定向為來自 \fI/dev/null\fP(並可考慮加上 \fB\-\-no\-run\-if\-empty\fP 選項)。 .TP \fB\-t, \-\-verbose\fP 在執行命令之前,將該命令列列印到標準錯誤輸出上。 .TP \fB\-x, \-\-exit\fP 如果大小超出限制(參見 \fB\-s\fP 選項),則退出程式。 .TP \fB\-\-\fP 用於標記選項列表的結束。其後的引數(如果有)即使以 \fI\-\fP 開頭,也會被當作運算元處理。例如,\fBxargs \-\- \-\-help\fP 會執行 \fIPATH\fP 中名為 \fI\-\-help\fP 的命令,而不是列印用法說明;\fBxargs \-\- \-\-mycommand\fP 會執行命令 \fI\-\-mycommand\fP,而不會將其視為無法識別的選項而報錯。 .TP \fB\-\-help\fP 列印 \fBxargs\fP 的選項摘要並退出。 .TP \fB\-\-version\fP 列印 \fBxargs\fP 的版本號並退出。 .PP 選項 \fB\-\-max\-lines\fP(\fB\-L\fP、\fB\-l\fP)、\fB\-\-replace\fP(\fB\-I\fP、\fB\-i\fP)以及 \fB\-\-max\-args\fP(\fB\-n\fP)是互斥的。如果同時指定了其中多個選項,\fBxargs\fP 通常會採用命令列中最後指定的選項,也就是說,之前指定的衝突選項會被重置為預設值。此外,\fBxargs\fP 會在 \fIstderr\fP 上發出警告資訊。此規則有一個例外:當使用 \fB\-\-replace\fP 或其別名 \fB\-I\fP、\fB\-i\fP 後,若再次指定特殊值 \fI1\fP(即 \&'\fB\-n\fP\fI1\fP'),該值將被忽略,因為它實際上並不構成衝突。 . .SH 示例 .nf \fBfind /tmp \-name core \-type f \-print | xargs /bin/rm \-f\fP .fi 在 \fB/tmp\fP 目錄中或其子目錄下查詢名為 \fBcore\fP 的檔案並將其刪除。請注意,如果有任何檔名中包含換行符或空格,該操作可能無法正確執行。 .P \fBfind /tmp \-name core \-type f \-print0 | xargs \-0 /bin/rm \-f\fP 在 \fB/tmp\fP 目錄中或其子目錄下查詢名為 \fBcore\fP 的檔案並將其刪除,處理檔名時會正確處理包含空格或換行符的檔案或目錄名稱。 .P \fBfind /tmp \-depth \-name core \-type f \-delete\fP 在 \fB/tmp\fP 目錄中或其子目錄下查詢名為 \fBcore\fP 的檔案並將其刪除,且比前一個示例更高效(因為我們避免了使用 \fBfork\fP(2) 和 \fBexec\fP(2) 來啟動 \fBrm\fP,也不需要額外的 \fBxargs\fP 程序)。 .P .nf \fBcut \-d: \-f1 < /etc/passwd | sort | xargs echo\fP .fi 生成系統上所有使用者的簡潔列表。 . .SH 退出狀態 \fBxargs\fP 退出時會使用下列狀態碼: .RS .IP 0 表示執行成功 .IP 123 表示所呼叫的命令中出現了退出狀態碼在 1\(en125 範圍內的情況 .IP 124 表示命令以 255 退出 .IP 125 表示命令被訊號殺死 .IP 126 表示無法執行命令 .IP 127 表示命令未找到 .IP 1 表示出現了其他錯誤。 .RE .P 大於 128 的退出狀態碼通常由 shell 所使用,指示程式由於某個致命訊號而停止。 . .SH 遵循標準 截至 GNU xargs 第 4.2.9 版,\fBxargs\fP 的預設行為是不適用邏輯上的檔案結束標記。POSIX (IEEE Std 1003.1, 2004 版) 允許該行為。 .P \-l 和 \-i 選項在 POSIX 標準的 1997 版出現,但在 2004 版中未出現。因此最好應使用 \-L 和 \-I 進行替代。 .P \-o 選項是 POSIX 標準中為了加強與 BSD 的相容性而出現的擴充套件。 .P POSIX 標準允許具體實現設定 \fBexec\fP 函式的引數大小限制。包含環境在內,其限制最小可以低至 4096 位元組。如需編寫可移植指令碼,指令碼不能假定更大的限制值。然而,筆者至今未曾見到最大值限制如此低的實現版本。可以使用 \fB\-\-show\-limits\fP 選項檢查當前系統上生效的實際限制值。 在 \fBxargs\fP 4.9.0 版和之前版本中,即便未使用 \fB\-P\fP 選項,SIGUSR1 和 SIGUSR2 也不會導致 \fBxargs\fP 終止執行。 . .SH 歷史 \fBxargs\fP 程式由貝爾實驗室的 Herb Gellis 所發明。請參見 findutils 的 texinfo 手冊中 \fIFinding Files\fP 一節以瞭解更多資訊。 . .SH 缺陷 無法保證 \fBxargs\fP 能夠完全安全地執行,因為在產生輸入檔案的列表和其被 \fBxargs\fP 執行的命令所處理這兩個事件之間總有時間差。如果有其他使用者同時在訪問系統,他們可以在這個時間視窗內操作檔案系統並迫使 \fBxargs\fP 要執行的命令本來要處理的檔案和實際處理的檔案不相同。如需瞭解對這個問題和相關問題更詳細的討論,請參考 findutils Texinfo 文件中的“Security Considerations”章節。\fBfind\fP 工具的 \fB\-execdir\fP 選項通常可以被用來提供更為安全的功能替代。 在使用 \fB\-I\fP 選項時,從輸入讀取的每一行都會儲存在內部緩衝區。這意味著使用 \fB\-I\fP 選項時 \fBxargs\fP 能接受的輸入行數存在上限。如需繞過這個限制,可以使用 \fB\-s\fP 選項來加大 \fBxargs\fP 所使用的緩衝區大小,且另外也可以使用多次額外的 \fBxargs\fP 呼叫來確保不會出現超長的行。例如: .P \fB某些命令 | xargs \-s 50000 echo | xargs \-I '{}' \-s 100000 rm '{}'\fP .P 在這裡,第一次呼叫的 \fBxargs\fP 因為未使用 \fB\-i\fP 選項而沒有輸入行長度限制。第二次呼叫的 \fBxargs\fP 確實存在限制,但我們已確保了它永遠不會遇到超出其處理能力範圍的行。這並不是最理想的解決方法。理想情況下,\fB\-i\fP 選項不應該預設行長度限制,這也是本段討論會出現在“缺陷”一節中的原因。這個問題在處理 \fBfind\fP(1) 的輸出時並不會出現,因其每行只會輸出一個檔名。 .P 在 \fBxargs\fP 4.9.0 版本及之前的版本中,\fBxargs \-P\fP 在其子程序仍在執行,但其中某些已經返回 255 的情況下會退出。 . .SH 報告缺陷 GNU findutils 線上幫助: .br 請向 報告翻譯錯誤。 .PP 請使用 GNU Savannah 缺陷追蹤系統上的表格報告任何出現的問題: .RS .RE 有關 GNU findutils 軟體包的通用主題可以在 \fIbug\-findutils\fP 郵件列表上討論: .RS .RE . .SH 版權 版權所有 \(co 1990\(en2024 自由軟體基金會。許可證 GPLv3+:GNU GPL 第 3 版或更新版本 。 .br 這是自由軟體:您可以自由地更改並對其重新發布。在法律所允許的範圍內不含任何擔保。 . .SH 參見 \fBfind\fP(1), \fBkill\fP(1), \fBlocate\fP(1), \fBupdatedb\fP(1), \fBfork\fP(2), \fBexecvp\fP(3), \fBlocatedb\fP(5), \fBsignal\fP(7) .PP 完整文件 .br 或者在本地使用:\fBinfo xargs\fP .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR