16

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に引数を渡すためのより良い方法を知っている人はいますか?

ありがとう!

4

2 に答える 2

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

@mortehuによって説明されているように:

parallelを介してコマンドに渡される引数は、シェルによって2回展開されます。1回はparallelの呼び出しで、もう1回はparallelがコマンドを実行するときです。-q2番目のシェルの拡張を防ぎます。

于 2011-11-22T17:26:42.027 に答える
13

マニュアルページには、引用専用のセクション全体があります。

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

それはあなたがあなたの質問に書いたまさにエラーメッセージにも言及しています。

あなたがそれをよりよく書くことができるならば、あなたのバージョンをparallel@gnu.orgに電子メールで送ってください。

于 2011-11-23T15:45:06.890 に答える