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 cmd
cmd
인수 없이 실행을 건너뜁니다 .
사용되면 -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
.xargs
xargs -0
xargs -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'
- ''