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


12

例如,使用命令

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

foo.txt包含两行

foo
bar

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

Answers:


6
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

棘手的部分是xargs执行隐式子shell调用。在这里,sh被显式调用,并且管道不成为父级传送器的一部分


1
谢谢,我更新了我的问题,以提供一个更具体的例子。但它没有按照您的建议工作
Ryan

1
echo无法从stdin中读取,因此对其进行管道传递没有任何意义。比较一下:cat foo.bar | wc -lcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
我想你的意思是-I代替-J; -Jxargs 没有选择
Hitechcomputergeek

FreeBSD的@Hitechcomputergeek版本xargs具有-J等效于-ilinux的选项xargs
Kondybas,2015年

@Kondybas感谢您告诉我;我不知道两者之间有什么区别。您可以相信GNU不遵循POSIX大声笑。(-J在POSIX中未定义,但-I用途与GNU有所不同。)
Hitechcomputergeek

2

如果要处理foo.txt的所有行,则必须使用循环。使用&把进程背景

while read line; do
   echo $line | bar.sh &
done < foo.txt

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

# 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     

不,不,我也坚持下去。TS希望将文件分成单独的行,然后将其单独输入脚本中
Kondybas 2013年

1
我需要使用xargs来并行化该过程
Ryan

OK :-)我只是查找了所xargs用OP 的选项。
Matteo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.