GNU 병렬이 "bash -c"와 작동하지 않는 이유는 무엇입니까?

GNU 병렬이 "bash -c"와 작동하지 않는 이유는 무엇입니까?
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}


%

두 번째 행도 동일하게 작동하기를 원합니다.

답변1

parallel명령이 셸에서 실행되었습니다(경험적 방법을 사용하여 해당 셸이 무엇인지 확인( 호출 셸과 동일한 셸을 parallel호출하는 것이 목적 )).parallel~에서). 이 $PARALLEL_SHELL변수를 설정하여 쉘을 수정할 수 있습니다 .)

or command 에 전달하는 명령이 아니라 parallel쉘 명령줄(명령에 전달하는 방식)입니다.envxargseval

for 와 마찬가지로 evalin 은 인수를 중간 공백으로 parallel arg1 arg2연결하여 parallel( 가 됨 arg1 arg2) 해당 문자열을 에 전달합니다 <the-shell> -c.

parallelstdin에 전달된 인수의 경우 특정 셸에서 예상되는 형식으로 인용하세요(이것은 어렵고 오류가 발생하기 쉬운 작업이므로 parallel변경 로그에서 수정된 많은 버그를 찾을 수 있습니다(parallel일부2017년 3월 6일 현재 아직 수정되지 않았습니다.)) 이를 해당 명령줄에 추가하세요.

예를 들어, 내부에서 호출되는 경우 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  {}

그리고 {}호출 중인 셸에 대한 올바른 형식으로 확장하고 인용한 다음 in 과 현재 인수를 사용하여 호출할 셸 parallel에 전달합니다 .<that-shell> -cbash -c echo:$1$0$1

그런 일은 일어나지 않았습니다 parallel. 여기에서 다음을 수행할 수 있습니다.

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

그것이 무엇인지 보려면 (또는 Linux가 아닌 경우 시스템에서 동등한 것)에서 실행할 parallel수 있습니다 .strace -fe execve

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

bash또한 따옴표가 없는 변수는 매우 특별한 의미를 가지며 echo일반적으로 임의의 데이터와 함께 사용할 수 없습니다.

관련 정보