% 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
쉘 명령줄(명령에 전달하는 방식)입니다.env
xargs
eval
for 와 마찬가지로 eval
in 은 인수를 중간 공백으로 parallel arg1 arg2
연결하여 parallel
( 가 됨 arg1 arg2
) 해당 문자열을 에 전달합니다 <the-shell> -c
.
parallel
stdin에 전달된 인수의 경우 특정 셸에서 예상되는 형식으로 인용하세요(이것은 어렵고 오류가 발생하기 쉬운 작업이므로 parallel
변경 로그에서 수정된 많은 버그를 찾을 수 있습니다(parallel
일부2017년 3월 6일 현재 아직 수정되지 않았습니다.)) 이를 해당 명령줄에 추가하세요.
예를 들어, 내부에서 호출되는 경우 bash
,
echo "foo'bar" | parallel echo foo
명령줄과 병행 bash -c
하여 호출됩니다 echo foo foo\'bar
. 를 사용하여 내부에서 rc
(또는 사용하여 PARALLEL_SHELL=rc
) 호출하는 경우 .rc -c
echo foo foo''''bar
귀하의 장소:
parallel bash -c 'echo :\$1' '' {}
parallel
이러한 매개변수를 연결하면 다음이 제공됩니다.
bash -c echo :$1 {}
그리고 {}
호출 중인 셸에 대한 올바른 형식으로 확장하고 인용한 다음 in 과 현재 인수를 사용하여 호출할 셸 parallel
에 전달합니다 .<that-shell> -c
bash -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
일반적으로 임의의 데이터와 함께 사용할 수 없습니다.