대체 문자열을 인용하지 않도록 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. 이렇게 하면 첫 번째 문제가 해결되지만 두 번째 문제는 해결되지 않습니다.

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

관련 정보