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
決定するのは難しいです。- 他の2つのインスタンス(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'
- ''