如何将引用的args传递给GNU Parallel

时间:2011-11-22 16:22:49

标签: bash parallel-processing args

我需要将一些包含空格和其他字符的文本传递给由GNU Parallel运行的脚本。

这是一个非常简单的例子:

$ seq 1 3 | parallel echo "Quoted ' (text)"

以上示例将输出:

sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file    

但是,如果我这样做,一切正常:

seq 1 3 | parallel echo "\"Quoted ' (text)\""

我碰巧是从python脚本运行它,所以在传递参数之前,我在脚本中引用它们是这样的:

args = ["Some arg", "Another arg", "etc."]
args = ' '.join(pipes.quote(pipes.quote(arg)) for arg in args)

但它似乎不是一个干净的解决方案。

有没有人知道将参数传递给GNU Parallel的更好方法?

谢谢!

2 个答案:

答案 0 :(得分:12)

zsh-4.3.12[sysadmin]% print -l {1..3} | 
  parallel -q echo "Quoted ' (text)"
Quoted ' (text) 1
Quoted ' (text) 2
Quoted ' (text) 3

正如@mortehu所描述的那样:

  

通过并行传递给命令的参数由shell扩展两次:一次在并行调用中,一次在并行运行命令时。 -q阻止第二个shell扩展。

答案 1 :(得分:8)

手册页中有一整段专门用于引用:

http://www.gnu.org/s/parallel/man.html#QUOTING

它甚至提到了你在问题中写的错误信息。

如果您可以更好地编写它,请将您的版本发送至:parallel@gnu.org。