Xargs

通過 xargs 傳遞多個參數

  • November 24, 2020

我希望能夠用於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 將這些值分配給$1and $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 1000toxargs來防止這種情況,其中 1000 是一個偶數,應該足夠小,以免達到arg 列表太長的限制,並且足夠大以避免執行這麼多printfs。

請注意,每次呼叫都在一個單獨的新程序中xargs呼叫,而不是你的 shell 的 builtin printf,而是 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"

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