기본적으로 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
. 이렇게 하면 첫 번째 문제가 해결되지만 두 번째 문제는 해결되지 않습니다.
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()'