4

ファイルから行を読み取り、それらの行でいくつかのロジックを実行する bash スクリプトがあります。

そう

while read line;
do
# some stuff
done < "$1"

while ループの本体では、1 つのコマンドの出力を にパイプしていますtee。この出力が非常に大きい場合 (100K 程度)、read line の次の呼び出しが失敗し、ファイル内のすべての行が読み取られる前に while ループが終了します。

なぜこれが起こるのですか?私は bash の専門家ではありませんが、何らかのバッファ オーバーフローが発生しているようです。もしそうなら、どうすればこれを修正できますか?

ありがとう

編集:したがって、いくつかの明確化が必要です。$1 は、ファイル名に対応する bash スクリプトに与えられる最初のコマンド ライン引数です。私が正確に行っているのは、入力ファイルの各行をパラメーターとして別のプログラムに渡すことです。そのプログラムの stdout と stderr を| tee -a somefile

私が入力しているプログラムは非標準です。私が読んでいるファイルの行によっては、このプログラムの出力が非常に大きくなる可能性があります。

だから私がやっていることのより詳細な例は

while read line;
do
setSomeVar1
setSomeVar2
program --output="$setSomeVar1" -options "$line" 2>&1 | tee -a "$setSomeVar2"
done < "$1"

ありがとう、

-D

4

2 に答える 2

3

ループ本体の他の何かが標準入力から読み取っている場合はread、別のファイル記述子から入力を取得できます(3は通常無料です)。

while read -u 3 line; do
...
done 3< "$1"
于 2013-02-27T17:40:19.880 に答える