GNU xargsで「-0」と一緒に使用すると、「-r」が無視されるように見えるのはなぜですか?

GNU xargsで「-0」と一緒に使用すると、「-r」が無視されるように見えるのはなぜですか?

xargs改行、呼び出し、その他の内容を含む一般的なケースを印刷します。printf

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

空の入力を使用すると、コマンドはまったく呼び出されません-rxargs

>>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決定するのは難しいです。

    • 他の2つのインスタンス(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 など、単に区切られたリストではありません-0xargsxargs -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'
 - ''

おすすめ記事