GNU 병렬이 왜“bash -c”와 작동하지 않습니까?


9
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}


%

나는 두 번째 줄이 똑같이 행동 할 것으로 기대합니다.

답변:


11

parallel(가에 의해 결정된다 쉘있는 이미 쉘에서 명령을 실행 parallel합니다 (하나와 같은 쉘을 호출하는 것을 의도 추론을 사용하여 parallel호출 에서를 ). 당신은 설정할 수 있습니다 $PARALLEL_SHELL쉘을 고정 변수).

이것은 당신이 전달하는 명령이 아니라 또는 명령에 parallel대한 것과 같지만 쉘 명령 행 ( 명령에 대한 것과 동일 )입니다.envxargseval

대해 원하는 eval에서 parallel arg1 arg2, parallel(가가되도록 사이에 공백 이러한 인자들을 연결된다 arg1 arg2), 그 문자열로 전달된다 <the-shell> -c.

parallel의 stdin 에 전달 된 인수의 경우 parallel특정 쉘에서 예상되는 형식으로 따옴표를 인용하십시오 (어려우며 오류가 발생하기 쉬운 작업이므로 parallelChangelog 에서 수정 된 버그가 많이 있습니다. 일부 는 여전히 2017-03-06)으로 수정되지 않았으며 해당 명령 줄에 추가됩니다.

예를 들어, within bash에서 호출 하면

echo "foo'bar" | parallel echo foo

명령 줄 bash -c과 병렬 호출 을 echo foo foo\'bar합니다. 그리고 만약 내에서 호출 rc(또는과 PARALLEL_SHELL=rc) rc -cecho foo foo''''bar.

당신의 :

parallel bash -c 'echo :\$1' '' {}

parallel 다음과 같은 주장을 연결합니다.

bash -c echo :$1  {}

과 그리고 {}당신이 전화하는거야 쉘에 대한 올바른 형식으로 확장 및 인용 parallel에서,에 있음을 전달 <that-shell> -c하는 호출 bash -c echo:$1에서 $0하고있는 현재 인수 $1.

parallel작동 방식 이 아닙니다 . 여기, 아마도 당신은 원할 것입니다 :

printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'

무엇을하는지 확인하기 위해 parallel아래에서 strace -fe execve(또는 Linux가 아닌 경우 시스템에서) 실행할 수 있습니다 .

여기서 기대하는 것에 더 가깝게 처리하는 xargs대신 GNU 를 사용할 수 있습니다 parallel.

printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''

https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html 의 토론도 참조 하십시오.

에서 인라인 스크립트에 빈 문자열을 bash -c 'echo foo' '' foo만들고 있음에 유의하십시오 $0. $0오류 메시지에도 사용 되므로 피하십시오 . 비교:

$ bash -c 'echo x > "$1"' '' /
: /: Is a directory

와.

$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory

또한 따옴표없는 변수를 남겨두면 매우 특별한 의미 bashecho있으며 일반적으로 임의의 데이터에는 사용할 수 없습니다.


4
몬 디우! 이것은 GNU Parallel의 저자가 쓴 것보다 더 나은 대답입니다.
Ole Tange
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.