デフォルトでは、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()'