Xargs
通過 xargs 傳遞多個參數
我希望能夠用於
xargs
在命令的不同部分執行多個參數。例如,以下內容:
echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2
我希望它會回來
the number 1 comes before 2 the number 3 comes before 4
… ETC
這是可以實現的嗎?我懷疑我的多次使用
-I
是不正確的。
我相信你不能用
-I
那種方式。但是你可以通過說得到你想要的效果/行為:echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh
從本質上講,這會創建一個臨時的單行 shell 腳本,該
xargs
腳本通過sh -c
. 從輸入中解析出來的兩個值xargs
被傳遞給這個“腳本”。然後 shell 將這些值分配給$1
and$2
,然後您可以在“腳本”中引用它們。
在特定情況下
printf
,您總是可以這樣做:echo {1..8} | xargs printf 'the number %s comes before %s\n'
因為如果給定的參數多於單次呼叫所需的參數,則
printf
具有內在xargs
的類似執行多次的能力。雖然這沒有什麼優勢printf 'the number %s comes before %s\n' {1..8}
對於大型列表,簡單的
xargs
命令可能會導致xargs
執行多個 的實例printf
,其中一些可能有奇數個參數。您可以通過-n 1000
toxargs
來防止這種情況,其中 1000 是一個偶數,應該足夠小,以免達到arg 列表太長的限制,並且足夠大以避免執行這麼多printf
s。請注意,每次呼叫都在一個單獨的新程序中
xargs
呼叫,而不是你的 shell 的 builtinprintf
,而是 external 。printf
另請注意,對於空輸入,除了在某些 BSD 上之外,它仍然會執行
printf
一次而沒有參數。GNUxargs
和兼容有一個-r
(或--no-run-if-empty
)選項來避免這種情況。需要明確的是,這個簡單的答案特定於您的
printf
範例,並且在您必須一次將兩個參數傳遞給命令的一般情況下不起作用(例如,情況就是這樣diff
)。要解決 的一般問題zsh
,您可以使用:for i j ({1..8}) echo "the number $i comes before $j"