Linux

使用 xargs –max-args –replace 與預設分隔符的問題

  • September 3, 2019

這按預期工作:

$ echo a b c | xargs --replace="{}" echo x "{}" y
x a b c y

這也是:

$ echo a b c | xargs --max-args=1 echo x
x a
x b
x c

但這並沒有按預期工作:

$ echo a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a b c y

這也不是:

$ echo a b c | xargs --delimiter=' ' --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c
y

我期望這個輸出:

x a y
x b y
x c y

作為一種解決方法,我正在使用 printf 和兩個 xargs,但這很難看:

$ echo a b c | xargs printf '%s\0' | \
> xargs --null --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y

知道為什麼會這樣嗎?

根據POSIX 文件xargs應該使用由空格或換行符分隔的參數執行給定的實用程序,這就是您的前兩個範例中發生的情況。

但是,當使用--replace(or -I) 時,只有換行符將分隔參數。補救措施是在不同的行上給出xargs論點:

$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y

使用 POSIX 選項:

printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y

在這裡,我給出的xargs不是一行,而是三行。它需要一行(最多)並以該行作為參數執行實用程序。

另請注意,上面的-n 1(or --max-args=1) 不是必需的,因為它的替換-I次數決定了使用的參數數量:

$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y

事實上,POSIX 規範的基本原理部分xargs說(我的重點)

-I和選項是互斥-L-n。如果在命令行上給出了多個,則某些實現使用指定的最後一個;其他實現以不同方式處理選項的組合。

在對此進行測試時,我注意到 OpenBSD 版本的xargs將在-n-I一起使用時執行以下操作:

$ echo  a b c | xargs -n 1  -I "{}" echo x "{}" y
x a y
x b y
x c y

這與 GNU coreutilsxargs所做的(產生x a b c y. 這是由於實現接受空格作為帶有 , 的參數分隔符-n,即使-I使用了。所以,不要一起使用-Iand -n(無論如何都不需要)。

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