상상하다:
$ process(){ echo "[$1] [$2] [$3]" ; } ; export -f process
$ process "x" "" "a.txt"
[x] [] [a.txt]
여기서는 두 번째 매개변수가 빈 문자열(예상)임을 알 수 있습니다.
$ find -name "*.txt" -print | SHELL=$(type -p bash) parallel process "x" ""
[x] [./a.txt] []
[x] [./b.txt] []
[x] [./c.txt] []
여기서 우리는 두 번째 매개변수가 (예기치 않게) find의 출력임을 알 수 있습니다.
예상 출력:
[x] [] [./a.txt]
[x] [] [./b.txt]
[x] [] [./c.txt]
어떻게 고치나요?
""
참고: 두 번째 인수가 에서 로 변경되면 "y"
find의 출력이 세 번째 인수(예상)로 나타납니다.
$ find -name "*.txt" -print | SHELL=$(type -p bash) parallel process "x" "y"
[x] [y] [./a.txt]
[x] [y] [./b.txt]
[x] [y] [./c.txt]
왜아니요find의 출력은 ""
?를 사용하여 세 번째 인수로 사용됩니다.
UPD: 해결책은 다음과 같습니다 \"\"
.
$ find -name "*.txt" -print | SHELL=$(type -p bash) parallel process "x" \"\"
[x] [] [./a.txt]
[x] [] [./b.txt]
[x] [] [./c.txt]
그러나 이것이 올바른 일반적인 해결책인지는 확실하지 않습니다. 다음은 반례입니다.
$ VAR="" ; find -name "*.txt" -print | SHELL=$(type -p bash) parallel process "x" "$VAR"
[x] [./a.txt] []
[x] [./b.txt] []
[x] [./c.txt] []
답변1
따라서 명령을 직접 실행하는 대신 셸을 통해 병렬로 실행하세요. 글쎄, 그래야만 합니다. 그렇지 않으면 사용하는 쉘 기능이 작동하지 않습니다.
이는 공백이 있는 매개변수가 분할된다는 의미이기도 합니다.
$ echo x | parallel process "foo bar" ""
[foo] [bar] [x]
개별 인수를 인용하든지 전체 명령을 인용하든 상관없습니다.
$ echo x | parallel "process foo bar"
[foo] [bar] [x]
다음을 수행할 수 있습니다.
$ echo x | parallel process '$(date +%F)'
[2024-02-29] [x] []
$ echo x | parallel "process foo bar > test.out"
$ cat test.out
[foo] [bar] [x]
임의의 값을 전달하려면 셸에서 해당 값을 인용해야 합니다. Bash에서는 ${var@Q}
변수 확장을 사용할 수 있습니다 .
$ var="foo bar"; echo x | parallel process "${var@Q}"
[foo bar] [x] []
이 작업을 병렬로 수행하는 옵션이 있는 것 같습니다.
--quote
-q
인용 명령. 명령;
\
|
*
에 셸이 해석하지 말아야 하는 특수 문자(예: )가 포함되어 있는 경우--quote
이러한 문자를 이스케이프 처리하세요. 명령은 리디렉션이나 변수 할당이 없는 간단한 명령(man bash 참조)이어야 합니다."참조" 섹션을 참조하세요. 대부분의 사람들은 이것이 필요하지 않습니다. 견적은 기본적으로 비활성화되어 있습니다.
$ var="foo bar"; echo x | parallel --quote process "$var"
[foo bar] [x] []
물론 이렇게 하면 리디렉션 등도 중단됩니다.
$ var="foo bar"; echo x | parallel --quote process "$var" ">test.out"
[foo bar] [>test.out] [x]
물론 공백을 인용하므로 명령 매개변수를 단일 문자열로 전달하려고 하면 실패합니다.
이 작업을 수행할 때 참고하세요.
$ VAR="" ; ... parallel process "x" "$VAR"
변수에는 여전히 병렬에 인수로 전달되는 빈 문자열만 포함됩니다. 와 동일하게 만들려면 parallel process "x" \"\"
변수에 큰 따옴표(예: VAR=\"\"
, 또는 VAR='""'
이에 상응하는 따옴표)를 사용해야 합니다. 아니면 대신 비슷한 것을 사용하십시오 parallel process "x" "'$VAR'"
. 변수 자체에도 따옴표가 포함될 수 있는 경우 콘텐츠를 맹목적으로 따옴표로 묶을 수 없다는 점을 명심하세요. 실패합니다.
$ var="ain't so"; echo x | parallel process "'$var'"
/usr/bin/bash: -c: line 1: unexpected EOF while looking for matching `''
/usr/bin/bash: -c: line 2: syntax error: unexpected end of file