xargs가 여러 줄 문자열을 단일 인수로 허용하도록 설정

xargs가 여러 줄 문자열을 단일 인수로 허용하도록 설정
git log --format=%B -n 1 HEAD | xargs -I{} npx ts-node --esm ./foobar.ts {}

git을 사용하여 최신 커밋 메시지를 메시지에서 배포 태그를 찾는 스크립트에 전달하는 것이 목적인 이 코드 줄이 있습니다.

두 줄 이상의 커밋 메시지의 경우 xargs는 foobar.ts를 여러 번 호출하여 전체 메시지를 매개변수로 전달하는 대신 커밋 메시지의 각 줄을 입력으로 사용합니다. 이 문제를 어떻게 해결할 수 있나요?

답변1

이를 사용하여 명령에 전달할 인수가 입력에서 NUL로 구분되도록 -0지시할 수 xargs있으며, 커밋 로그에는 NUL 문자가 포함될 수 없으므로 전체 입력(마지막 줄 포함)이 하나의 인수로 명령에 전달됩니다.

git log --format=%B -n 1 HEAD |
  xargs -r0 npx ts-node --esm ./foobar.ts

그러나 현재의 모든 xargs구현이 구분되지 않은 레코드를 무시하지는 않지만,정상적인 상황에서 이는 잠재적으로 위험한 일입니다., POSIX는 표준의 다음 버전에서 지정 -r하고-0무시하는 것이 좋습니다(필수는 아님).:

표준 입력이 비어 있지 않고 null 바이트로 끝나지 않는 경우 xargs뒤에 오는 null이 아닌 바이트는 무시되어야 하지만(이는 불완전한 데이터를 나타낼 수 있음) 유틸리티에 전달된 마지막 인수로 사용될 수 있습니다.

따라서 이에 대한 의존은 미래 상황에 적응하지 못할 수도 있습니다. NUL을 추가할 수 있지만 NUL로 커밋을 구분하는 옵션을 지원 (git...; printf '\0') | xargs -r0...하므로 미래에도 사용할 수 있습니다.git log-z

git log --format=%B -zn 1 HEAD |
  xargs -r0 npx ts-node --esm ./foobar.ts

여러 제출물을 보낼 수도 있습니다.

또는 셸의 명령 대체를 사용할 수 있습니다.

npx ts-node --esm ./foobar.ts "$(git log --format=%B -n 1 HEAD)"

명령 대체는 비어 있지 않은 마지막 줄의 줄 구분 기호와 해당 줄 뒤의 빈 줄(있는 경우)을 포함하여 모든 후행 줄 바꿈을 제거합니다.

xargs어떤 상황에서도 입력에서 여전히 인용 처리를 수행하고 아포스트로피가 포함된 커밋 로그를 차단하거나 인용 또는 백슬래시 내용이 포함된 항목을 중단하는 ' 없이 또는 함께 사용할 수 없습니다 .-I-0-dxargs

관련 정보