xargs의 예기치 않은 출력

xargs의 예기치 않은 출력

다음 명령문은 인쇄되어야  afc abc하지만 대신 인쇄됩니다  abc abc . 여러 번 시도했지만 결과는 매번 동일합니다. 왜 이런 일이 발생하는지 모르겠습니다. 누군가 설명하고 도와줄 수 있습니까?

echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}

답변1

예, 그렇습니다. xargs쉘이 시작되기 전에 명령 대체가 쉘에 의해 수행되기 때문입니다. replacement 에서 연산할 문자열을 인쇄합니다 echo. 아무런 변경 없이 결과를 보면 다음과 같습니다.{}sedsedxargs

echo {} {}

대신에:

echo 'abc' | xargs -I{} bash -c 'echo "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

여기서는 인라인 스크립트에 명령 대체를 삽입하여 쉘이 명령 대체를 평가하는 것을 방지합니다. 스크립트는 ( abc) 에서 명령줄 인수를 가져 xargs와서 작동합니다 "$1".

printf대시 및 기타 문자를 옵션으로 해석할 수 있는 문자로 바꾸 려면 a다음을 사용하는 것이 더 좋습니다 echo.

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "$(sed "s/b/f/g" <<<"$1")" "$1"' bash {}

또는 다음 없이 sed:

echo 'abc' | xargs -I{} bash -c 'printf "%s %s\n" "${1//b/f}" "$1"' bash {}

아니면 혼자서도 할 수 있습니다 sed(적어도 이 간단한 예에서는):

echo 'abc' | sed 'h; s/b/f/g; G; s/\n/ /'

관련 정보