2014-01-11 100 views
4

我可能根本不知道如何說出我所問的內容,但我一直無法獲得我正在尋找的答案。運行腳本的Bash捕獲輸出

所以我想要在bash腳本中運行一個命令或腳本,一行一行地捕獲輸出,並根據一些值進行檢查。

我已經試過的東西的

#!/bin/bash 
./runningscript.sh | while read line; do 
echo "output $line" 
done 

#!/bin/bash 

./runningscript.sh | {read line echo "output $line"} 

都似乎只是執行腳本給我正常的輸出效果。我想要的是在這個bash腳本中處理來自runscript.sh的每一行輸出,因爲它是輸出,我不希望它等到runningscript.sh完成運行來處理它。

對不起,我是一個很偶然的,簡單的bash用戶因此這可能要問愚蠢的問題,但任何幫助,將不勝感激

回答

7

你腳本工作。但輸出直到後期纔出現,甚至可能在命令完成後出現?這通常是因爲緩衝:runningscript.sh必須填滿緩衝區,通常爲4 kB,然後才能通過管道將其輸出傳輸到管道中的下一個進程。

一個修復程序是使用unbuffer命令這是expect包的一部分:

unbuffer runningscript.sh | something_else 

這花樣runningscript.sh以爲該寫入到交互終端。因此,它不會緩衝。

如需更多信息,請參閱https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

或者,如果你有GNU的coreutils 7.5或更好,你可以禁用與stdbuf命令輸出緩衝:

stdbuf -oO runningscript.sh | something_else 
+0

這正是我所需要的,非常感謝你!對不起,我不能贊成,我沒有我猜的聲譽。 – hmoebius

+1

Upvoted現在我有足夠的代表。再次感謝! – hmoebius

1

我看到的最常見的形式是:

while read line; do 
    stuff to $line 
done < $(somescript.sh) 
+0

感謝您的幫助。我仍然得到相同的結果,雖然我的腳本由於選項錯誤,所以我把它包含在$()中,所以它看起來更像'done <$(./ runningscript.sh --opt ........ )'這可能與它有關嗎? – hmoebius

0

對於這個,你必須編輯runningscript.sh並把echo或任何行動,你想把它放在自己的循環。管道不能幫助你,因爲它首先完成它的第一個程序,然後把它輸出到第二個程序。如果您改進了runningscript.sh,則不需要使用額外的腳本。