一个变量var
包含多个参数,每个参数由新行分隔。
echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three
但是,当省略-I
和%
字符时,我得到以下结果:
echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three
我曾经读到过 {} 会替代当前参数(就像 find 一样),但事实并非如此。我做错了什么?
答案1
的通常行为xargs
是将尽可能多的参数粘贴到它运行的任何命令的命令行上,并不断重复,直到完成所有参数。当以这种方式使用时,它可以解决命令行长度限制的问题。
但是当您指定该-I
选项时,它会对每个参数运行该命令单独地,一次一个。我不认为这在 Linuxxargs -I
选项的文档中完全显而易见,但这就是他们的意思。
-I replace-str
Replace occurrences of replace-str in the initial-arguments with
names read from standard input. Also, unquoted blanks do not
terminate input items; instead the separator is the newline
character. Implies -x and -L 1.
答案2
如果您使用 GNU Parallel 而不是 xargs,您可以控制您想要的行为:
# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {}
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {}
安装 GNU Parallel 只需 10 秒钟:
wget pi.dk/3 -qO - | sh -x
观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1