xargs는 두 번째 스크립트 인수를 무시합니다.

xargs는 두 번째 스크립트 인수를 무시합니다.

저는 두 개의 매개변수를 사용하여 bash 스크립트를 호출하고 있습니다. 이를 param_oneand 이라고 부르겠습니다 param_two. 또한 test두 줄이 포함된 파일이 있습니다 .

line_one
line_two

내 스크립트는 다음과 같습니다

cat test | xargs -I% bash -c 'echo % $1 $2;'

내가 찾고있는 결과는 다음과 같습니다.

line_one param_one param_two
line_two param_one param_two

하지만 나는 계속 이런 말을 듣습니다.

line_one
line_two

xargs스크립트에 여러 매개변수가 있으면 무시됩니다. 스크립트를 이렇게 변경해도 인쇄만 됩니다.param_oneparam_one

cat test | xargs -I% bash -c 'printf '$1 $2';'

그러나 동일한 명령에서 스크립트를 호출할 때 %from 및 from 세 가지 매개변수를 모두 사용해야 합니다 . 이를 수행하는 적절한 방법에 대한 제안이 있습니까, 아니면 부적절합니까?xargs$1$2xargsxargs

답변1

존재하다:

cat test | xargs -I% bash -c 'echo % $1 $2;'

$1$2매개변수에 리터럴 문자열 bash -c(예: 인라인 스크립트) 로 전달 됩니다 . %스크립트 내에서도 확장되므로 쉘 코드로 처리됩니다 . 예를 들어, test포함된 경우 명령 ;reboot;을 호출하게 됩니다 reboot.

이 인라인 스크립트에 매개변수를 전달하지 않으므로 $1$2비어 있습니다.

다음을 수행할 수 있습니다.

< test xargs -I% bash -c 'echo "$1" "$2" "$3"' bash % "$1" "$2"

스크립트의 인수를 인라인 스크립트로 전달하고 문자가 포함된 $1경우 $2거기에서 확장할 수도 있습니다 %.xargs

따라서 환경을 사용하여 다음 값을 전달할 수 있습니다.

< test PARAM1=$1 PARAM2=$2 xargs -I% bash -c '
  echo "$1" "$PARAM1" "$PARAM2"' bash %

또한 xargs입력 내용에 일부 인용이 있다는 점에 유의하십시오. 이는 각 줄의 원시 콘텐츠를 그대로 전달하려는 경우 사용하는 것이 아닙니다. GNU를 사용하면 xargs다음과 같은 작업을 수행할 수 있습니다.

< test xargs -d '\n' -n 1 bash -c 'echo "$3" "$1" "$2"' bash "$1" "$2"

또한 변수를 인용하는 것을 잊지 마십시오. 보다 printf더 신뢰할 수 있습니다echo체재, 그래서는 안됩니다바꾸다.

관련 정보