使用 xargs 时重定向到 stdin 而不是参数

Rya*_*yan 15 linux bash command-line-interface xargs

例如,使用命令

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"
Run Code Online (Sandbox Code Playgroud)

foo.txt包含两行

foo
bar
Run Code Online (Sandbox Code Playgroud)

上面的命令不打印任何内容。

Kon*_*bas 6

cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 
Run Code Online (Sandbox Code Playgroud)

棘手的部分是 xargs 执行隐式子外壳调用。这里 sh 显式调用,管道没有成为父传送器的一部分

  • 我认为你的意思是“-I”而不是“-J”;xargs 没有“-J”选项 (2认同)

Mat*_*teo 3

如果您想处理 foo.txt 的所有行,则必须使用循环。用于&将进程置于后台

while read line; do
   echo $line | bar.sh &
done < foo.txt
Run Code Online (Sandbox Code Playgroud)

如果您的输入包含空格,请暂时将内部字段分隔符设置为换行符

# save the field separator
OLD_IFS=$IFS

# new field separator, the end of line 
IFS=$'\n'

for line in $(cat foo.txt) ; do
   echo $line | bar.sh &
done

# restore default field separator  
IFS=$OLD_IFS     
Run Code Online (Sandbox Code Playgroud)