다음 명령문은 인쇄되어야 afc abc
하지만 대신 인쇄됩니다 abc abc
. 여러 번 시도했지만 결과는 매번 동일합니다. 왜 이런 일이 발생하는지 모르겠습니다. 누군가 설명하고 도와줄 수 있습니까?
echo abc|xargs -i{} echo $(echo {}|sed 's/b/f/g') {}
답변1
예, 그렇습니다. xargs
쉘이 시작되기 전에 명령 대체가 쉘에 의해 수행되기 때문입니다. replacement 에서 연산할 문자열을 인쇄합니다 echo
. 아무런 변경 없이 결과를 보면 다음과 같습니다.{}
sed
sed
xargs
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/ /'