GNU Parallel:不要引用包含空格的 Perl 替换字符串值?
GNU Parallel: Do not quote Perl replacement string values that contain spaces?
我用 parallel
编写的脚本目前看起来像这样:
#!/bin/bash
seq ${2:-3} | parallel --tty -j0 sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q '2>/dev/null'
例如运行 ./sidrender.sh Stomp.sid
预计执行以下命令:
sidplayfp -wch1.wav -u2 -u3 -q Stomp.sid 2>/dev/null
sidplayfp -wch2.wav -u1 -u3 -q Stomp.sid 2>/dev/null
sidplayfp -wch3.wav -u1 -u2 -q Stomp.sid 2>/dev/null
然而,这并不能正常工作,当使用 --dry-run
进行查看时,发现 parallel
将 -u
标志一起引用(例如 sidplayfp -wch1.wav '-u2 -u3' -q Stomp.sid 2>/dev/null
)因为它们来自相同的 Perl 表达式。
这是正在发生的事情的一个最小示例:
$ parallel --dry-run 'echo {= $_="foo bar" =}' ::: 1
echo 'foo bar'
如果您将 "foo bar"
替换为 "foo"
,输出将是 echo foo
,不带任何引号。
因为 sidplayfp
在引用时没有正确解析参数,我需要一种方法来阻止 parallel
引用输出,但我在 man 中找不到这样做的方法页。
使用eval
:
seq ${2:-3} |
parallel --tty -j0 eval sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q '2>/dev/null'
我用 parallel
编写的脚本目前看起来像这样:
#!/bin/bash
seq ${2:-3} | parallel --tty -j0 sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q '2>/dev/null'
例如运行 ./sidrender.sh Stomp.sid
预计执行以下命令:
sidplayfp -wch1.wav -u2 -u3 -q Stomp.sid 2>/dev/null
sidplayfp -wch2.wav -u1 -u3 -q Stomp.sid 2>/dev/null
sidplayfp -wch3.wav -u1 -u2 -q Stomp.sid 2>/dev/null
然而,这并不能正常工作,当使用 --dry-run
进行查看时,发现 parallel
将 -u
标志一起引用(例如 sidplayfp -wch1.wav '-u2 -u3' -q Stomp.sid 2>/dev/null
)因为它们来自相同的 Perl 表达式。
这是正在发生的事情的一个最小示例:
$ parallel --dry-run 'echo {= $_="foo bar" =}' ::: 1
echo 'foo bar'
如果您将 "foo bar"
替换为 "foo"
,输出将是 echo foo
,不带任何引号。
因为 sidplayfp
在引用时没有正确解析参数,我需要一种方法来阻止 parallel
引用输出,但我在 man 中找不到这样做的方法页。
使用eval
:
seq ${2:-3} |
parallel --tty -j0 eval sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q '2>/dev/null'