打印换行、xargs
调用printf
和某些内容的常规情况:
>>printf "foo\n" | xargs -r printf "->%s\n"
->foo
>>
Run Code Online (Sandbox Code Playgroud)
随着空输入代替,-r
使得xargs
不是在所有调用命令:
>>printf "\n" | xargs -r printf "->%s\n"
>>
Run Code Online (Sandbox Code Playgroud)
使用空值而不是换行符,如果有以下输入,一切都是一样的xargs
:
>>printf "foo\0" | xargs -r -0 printf "->%s\n"
->foo
>>
Run Code Online (Sandbox Code Playgroud)
但是如果没有输入,无论如何都会打印一些东西:
>>printf "\0" | xargs -r -0 printf "->%s\n"
->
>>
Run Code Online (Sandbox Code Playgroud)
所以,要么
我错过了一些东西(什么?)
-r
当与-0
(但哪个)一起使用时,有一些很好的理由可以忽略?
我的xargs
(findutils 4.6.0.225-235f)中有一个错误,但很难决定:
那么, 的真正预期行为是xargs
什么?
xargs -r cmd
跳过cmd
没有参数的运行。
使用-0
,为每个 NUL 分隔的输入记录创建一个参数
printf '\0' | xargs -r0 cmd
Run Code Online (Sandbox Code Playgroud)
您正在提供一个空记录,因此cmd
使用一个空参数调用(并且使用printf '\0\0'
,这将是 2 个空记录等)。
和:
printf '' | xargs -r0 cmd
Run Code Online (Sandbox Code Playgroud)
你没有记录,所以cmd
没有运行。
和:
printf '' | xargs -0 cmd
Run Code Online (Sandbox Code Playgroud)
你仍然没有提供任何记录,但是因为-r
没有提供,cmd
仍然没有参数地调用一次。
没有-0
,xargs
需要一个非常特殊的输入格式,它不是一个简单的分隔列表,如 withxargs -0
或xargs -d '\n'
要提供一个空参数,您需要如下内容:
printf '""\n' | xargs -r cmd
printf "''\n" | xargs -r cmd
Run Code Online (Sandbox Code Playgroud)
或者就此而言:
printf '\n\n \t\t "" \n\n \t\n' | xargs -r cmd
Run Code Online (Sandbox Code Playgroud)
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' ''
Run Code Online (Sandbox Code Playgroud)
或者:
$ printf '\t\n\0\0' | xargs -0 zsh -c 'print -rl $#: " - ${(q+)^@}"' zsh
2:
- $'\t\n'
- ''
Run Code Online (Sandbox Code Playgroud)