代替文字列を引用しないようにGNU Parallelに指示する方法

代替文字列を引用しないようにGNU Parallelに指示する方法

デフォルトでは、GNU Parallelは代替文字列を引用してシェルから拡張されないようにします。ただし、場合によっては、シェルが代替文字列を解釈したい場合があります。

例えば

$ 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。これにより最初の問題は解決されますが、2番目の問題は解決されません。

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()'

関連情報