bash で while read LINE ループを実行すると、バッファリングがまったく行われないため、stdin からの大きな入力の読み取りは非常に非効率的になります。
while read -n 4096 LINE を使用すると、その場しのぎのバッファリングが提供され、bash が大量の入力の読み取りをより効率的に実行できるようになりますか?
いいえ。次の方法で、読み取りが一度に 1 つずつ実行されていることを確認できます。
echo foo | strace bash -c 'read -n 100 f'
1 回の読み取りに 4 つのシステム コールが必要であることがわかります。しかし、やりたいことは簡単に実現できます。標準入力から最大 4096 バイトを変数に入れるには、プロセス置換を使用します。
bash -c 'r=$( dd bs=4096 count=1 2> /dev/null); echo "$r"'
(-N
代わりに-n
) オプションは、改行文字を超えて読み取ります。