在后台运行带有&符号的Bash管道命令

22
time for i in `ls /tmp/chunk*`; do (cat $i | tr ' ' '\n' | sort | uniq > /tmp/line${i:10}) & ;done
bash: syntax error near unexpected token `;'

以上命令存在语法错误,请问是什么原因?我也尝试使用{},并以;结束管道命令,但是出现了相同的错误提示...


3
下面回答的区别是,{} 在当前 shell 上下文中执行。() 创建了一个新的子 shell,因此您不会保留变量赋值。 - Tathagata
3个回答

38

如果你想要在后台并行运行所有作业,你应该将&放在()内。

time for i in `ls /tmp/chunk*`; do
  (cat $i | tr ' ' '\n' | sort | uniq > /tmp/line${i:10} &)
done

2
这是因为&和;都是命令分隔符:[http://stackoverflow.com/questions/12034909/why-do-i-get-unexpected-token] - Campa
1
如何以此格式获取上一个命令的pid?这样做行不通:“uniq_pid=$!” - Egor Okhterov

28

您可以将&放在花括号中:

time for i in `ls /tmp/chunk*`; do
  {(cat $i | tr ' ' '\n' | sort | uniq > /tmp/line${i:10}) &};
done

谢谢@IcanDivideBy0...但是只能接受一个答案。顺便说一下,昵称很不错:D - Tathagata
6
@Tathagata:您可以点赞此答案以向发帖者提供10个声望值。 - Fred Foo

14

& 是一个分隔符,因此与 ; 重复了。也就是说,删除最后一个 ;

for i in /tmp/chunk*; do tr ' ' '\n' <$i | sort -u > /tmp/line${i:10}& done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接