![xargsはstdin入力が完了して処理を開始できるかどうかをどうやって知ることができますか? [コピー]](https://linux33.com/image/142589/xargs%E3%81%AFstdin%E5%85%A5%E5%8A%9B%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%97%E3%81%A6%E5%87%A6%E7%90%86%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E7%9F%A5%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
読んだ後Steven Kitの答え、xargsは入力を処理する前に(例えば引数に分割する)stdin入力を受け取るのを待ちます。
xargsはstdin入力が完了して処理を開始できるかどうかをどうやって知ることができますか?
-E
stdin入力の終わりを指定するために使用されますか?
それがなければ、xargsがいつ完了したかをどうやって知ることができますか?タイムアウトがありますか?
答え1
入力を読み取るには、xargs
次のようにします。read
機能(また参照対応するLinuxのマンページ)。
read
ファイル記述子で使用可能な次のデータを呼び出し側プログラムによって指定されたメモリー領域に読み込みます。使用されているとおりにxargs
データread
が利用可能になるまで待つか、エラーが発生するか、使用可能なデータがないと判断されるまで待ちます。それぞれの場合、それぞれ正の整数、-1 または 0 を返します。
-a
入力(標準入力またはオプションで指定された入力)読み取りがいつ完了したかを確認するには、xargs
指定されたファイルの終わりを表示する(-E
そのオプションが使用されている場合)を見つけますread
。
以下を実行して実際にこれを確認できます。
printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x
答え2
xargsはstdin入力が完了して処理を開始できるかどうかをどうやって知ることができますか?
xargs
するいいえ処理を開始する前にstdinが完了するまで待ってください。
$ while date +%H:%S; do sleep 1; done | xargs -n2 echo
16:51 16:52
16:53 16:54
16:55 16:56
16:57 16:58
^C
xargs
他のプログラムと同様に、標準入力が終了したことを知っています。 cat(1) または tee(1) は read(2) の戻り値を確認し、feof(3) を呼び出すなどの方法でxargs
stdin の読み込みエラーもファイルの末尾として処理します。