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'