Linux
使用 xargs –max-args –replace 與預設分隔符的問題
這按預期工作:
$ 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 coreutils
xargs
所做的(產生x a b c y
. 這是由於實現接受空格作為帶有 , 的參數分隔符-n
,即使-I
使用了。所以,不要一起使用-I
and-n
(無論如何都不需要)。