
xargs -I
하위 명령에는 적용할 수 없습니다.
예:
# Not working
ls .... | xargs -n 1 -I % sh -c "cmd $(cmd2 % )"
# working
ls .... | xargs -n 1 -I % sh -c "cmd % "
어린이 수업에서 대체를 할 수 있는 방법이 있나요?
답변1
문제는 쉘이 큰따옴표로 묶인 문자열 인수로 명령 대체를 확장한다는 것입니다.xargs
시작하기도 전에이는 마지막 인수를 평가하기 위해 cmd2
리터럴 인수를 사용하여 쉘이 실행된다는 것을 의미합니다 .%
xargs
두 번째 예제 명령에는 끝에 있는 쉘 코드 인수에 호출 쉘이 시작하기 전에 처리해야 하는 확장이 포함되어 있지 않기 때문에 이 문제가 없습니다 xargs
.
큰따옴표 대신 작은따옴표로 매개변수를 인용하면 첫 번째 명령에서 이 문제를 해결할 수 있습니다.
ls
그러나 구문 분석된 출력이 나쁜 생각인 데에는 그만한 이유가 있습니다 . %
실행될 셸 코드에 자리 표시자를 포함시키므로 파일 sh -c
이름에 따옴표, 와일드카드 문자 또는 확장(예: 다른 확장)이 포함되어 있으면 실제 문제가 발생합니다. $(...)
이 경우 일반 쉘 루프를 사용하는 것이 더 안전합니다.
for name in ...; do cmd "$(cmd2 "$name")"; done
또는 아마도 더 읽기 쉬울 것입니다.
for name in ...; do
cmd "$(cmd2 "$name")"
done
... ...
관심 있는 이름과 일치하는 패턴은 어디에 있나요?
또한보십시오:
또한 관련됩니다( 쉘 코드에 포함하는 것은 %
쉘 코드에 포함하는 것과 xargs
동일한 문제가 있습니다 ):{}
find