2013-02-27 193 views
3

我有一個bash腳本從文件中讀取行,然後用這些行做一些邏輯。Bash讀取行緩衝區溢出

所以

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

在while循環我一個管道命令的輸出tee的身體。 當這個輸出非常大時,在100K的數量級上,下一次讀取線路的調用失敗,while循環在讀取文件中的所有行之前終止。

爲什麼會發生這種情況?我不是一個bash專家,但它似乎正在發生某種緩衝區溢出。如果是這樣,我該如何糾正?

感謝, -D

編輯: 所以一些澄清是爲了。 $ 1是提供給bash腳本的第一個命令行參數,它對應於文件名。我正在做的是將輸入文件的每一行作爲參數傳遞給另一個程序。我正在將該程序的標準輸出和標準輸出到| tee -a somefile

我給輸入的程序是非標準的。根據我正在閱讀的文件的行,該程序的輸出可能非常大。

所以我在做什麼更詳細的例子是

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

感謝,

-D

+0

什麼是'$ 1'?你到底在做什麼? – chepner 2013-02-27 17:32:26

+0

這個工作的正確工具...... bash是不是。 – 2013-02-27 17:33:23

+2

循環體中的其他內容也有可能從標準輸入中讀取,這意味着它正在從用於「讀取」命令的文件中抽取數據。 – chepner 2013-02-27 17:33:31

回答

2

如果什麼都在循環體是從標準輸入讀,你可以有read從不同的文件描述符中獲得輸入(3通常是空閒的):

while read -u 3 line; do 
... 
done 3< "$1" 
+0

猜測和任何考慮缺乏細節一樣好(雖然猜得不錯!) – 2013-02-27 17:41:38

+0

我會給這個鏡頭,謝謝。 – zdevex 2013-02-27 20:51:32

+0

@Fredrik我並不是故意缺乏細節。我原以爲我已經給了所有相關的。我更新了上面的帖子,提供了更多細節。有沒有其他細節會有幫助? – zdevex 2013-02-27 20:52:19