如何告诉 GNU Parallel 不要引用替换字符串

如何告诉 GNU Parallel 不要引用替换字符串

默认情况下,GNU Parallel 会引用替换字符串,这样它们就不会被 shell 扩展。但在某些情况下,您确实希望 shell 解释替换字符串。

例如

$ cat variables.txt
--var1 0.1 --var2 0.2
--var1 0.11 --var3 0.03

这里我希望 GNU Parallel 运行:

myprogram --var1 0.1 --var2 0.2
myprogram --var1 0.11 --var3 0.03

这是怎么做到的?

如果只解释一些替换字符串,这是如何完成的:

例如

$ ls
My file1.txt
My file2.txt

我想要这样运行:

myprogram --var1 0.1 --var2 0.2 'My file1.txt'
myprogram --var1 0.11 --var3 0.03 'My file1.txt'
myprogram --var1 0.1 --var2 0.2 'My file2.txt'
myprogram --var1 0.11 --var3 0.03 'My file2.txt'

答案1

uq()从版本 20190722 开始,您可以在 Perl 替换字符串中使用以使该替换不带引号:

parallel myprogram '{=1 uq(); =}' {2} :::: variables.txt ::: My*.txt

这在早期版本中无法完成。但是,您可以使用 取消引用完整命令eval。这解决了第一个问题,但没有解决第二个问题。

parallel eval myprogram {} :::: variables.txt

如果您希望所有替换字符串都不加引号,则可以通过重新定义它们来实现:

parallel --rpl '{} uq()' echo {} ::: '*'

您可以输入--rpl~/.parallel/config使它们默认处于活动状态(这些只是源代码中添加的定义uq()):

--rpl '{} uq()'
--rpl '{#} 1 $_=$job->seq(); uq()'
--rpl '{%} 1 $_=$job->slot(); uq()'
--rpl '{/} s:.*/::; uq()'
--rpl '{//} $Global::use{"File::Basename"} ||= eval "use File::Basename; 1;"; $_ = dirname($_); uq()'
--rpl '{/.} s:.*/::; s:\.[^/.]*$::; uq; uq()'
--rpl '{/.} s:.*/::; s:\.[^/.]*$::; uq()'
--rpl '{.} s:\.[^/.]*$::; uq()'

相关内容