GNU xargs에서 "-0"과 함께 사용할 때 "-r"이 무시되는 것처럼 보이는 이유는 무엇입니까?

GNU xargs에서 "-0"과 함께 사용할 때 "-r"이 무시되는 것처럼 보이는 이유는 무엇입니까?

xargs개행, 호출 및 기타 내용을 포함하는 일반적인 사례를 인쇄합니다 .printf

>>printf "foo\n" | xargs -r printf "->%s\n"
->foo
>>

빈 입력을 사용하면 명령이 전혀 호출되지 -r않습니다 .xargs

>>printf "\n" | xargs -r printf "->%s\n"
>>

개행 대신 null을 사용하면 입력이 있으면 모든 것이 동일합니다 xargs.

>>printf "foo\0" | xargs -r -0 printf "->%s\n"
->foo
>>

그러나 입력이 없으면 어쨌든 뭔가가 인쇄됩니다.

>>printf "\0" | xargs -r -0 printf "->%s\n"
->
>>

그래서,

  • 뭔가 빠졌네요(뭐?)

  • (그러나 어느) -r과 함께 사용할 때 무시해야 할 몇 가지 이유가 있습니까 ?-0

  • 내 버그(findutils 4.6.0.225-235f)가 있지만 xargs결정하기가 어렵습니다.

    • 다른 두 인스턴스(Ubuntu 16.04의 경우 4.7.0-git, Windows의 경우 4.6.0)에서 동일한 동작을 발견했습니다.
    • 이런 종류의 일이 회귀 테스트를 통과할 수 있다는 것을 믿을 수 없습니다.
    • 반면에이 문제과거에는 효과가 있었을 수도 있다는 의미입니다

그렇다면 실제 예상되는 동작은 무엇입니까 xargs?

답변1

xargs -r cmdcmd인수 없이 실행을 건너뜁니다 .

사용되면 -0입력의 NUL로 구분된 각 레코드에 대해 매개변수가 생성됩니다.

printf '\0' | xargs -r0 cmd

빈 레코드를 입력하므로 cmd빈 인수로 호출하십시오(그리고 를 사용하면 printf '\0\0'2개의 빈 레코드가 됩니다 등).

그리고:

printf '' | xargs -r0 cmd

레코드를 제공하지 않았으므로 cmd실행되지 않습니다.

그리고:

printf '' | xargs -0 cmd

아직 레코드를 제공하지 않았지만 -r제공된 레코드가 없으므로 cmd매개변수 없이 한 번 호출됩니다.

없이는 매우 특별한 입력 형식이 필요합니다. with 또는 같이 단순하게 구분된 목록이 아닙니다 -0.xargsxargs -0xargs -d '\n'

빈 매개변수를 제공하려면 다음과 같은 것이 필요합니다.

printf '""\n' | xargs -r cmd
printf "''\n" | xargs -r cmd

또는 그 문제에 대해서는:

printf '\n\n \t\t "" \n\n \t\n' | xargs -r cmd

printf -- '-%s\n'이 명령은 빈 인수를 전달할 때와 인수를 전달하지 않을 때 동일한 출력을 제공하므로 테스트하기 위한 최선의 선택은 아닙니다.

더 나은 방법은 다음과 같습니다.

$ printf '\n\n \t\t "" \n\n \t\n' | xargs -r zsh -c 'PS4=Got; set -x; : "$@"' zsh
Got: ''
$ printf '\n\n \t\t \n\n \t\n' | xargs zsh -c 'PS4=Got; set -x; : "$@"' zsh
Got:
$ printf '\t\n\n' | xargs -rd '\n' zsh -c 'PS4=Got; set -x; : "$@"' zsh
Got: $'\t' ''

또는:

$ printf '\t\n\0\0' | xargs -0 zsh -c 'print -rl $#: " - ${(q+)^@}"' zsh
2:
 - $'\t\n'
 - ''

관련 정보