"xargs -I"는 하위 명령에서 작동하지 않습니다.

"xargs -I"는 하위 명령에서 작동하지 않습니다.

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

관련 정보