2014-01-29 47 views
0

我正在運行一個python腳本,當它以詳細模式運行時會產生某些輸出。當我將輸出輸出到較少的實用程序時,輸出的順序不同。作爲參考,腳本,如果不完全,非常接近這樣的:爲什麼輸出更少的變化順序?

http://svn.apache.org/repos/asf/subversion/trunk/tools/client-side/change-svn-wc-format.py

具體來說,我得到的「數據爲以下字段(S)」的消息,當我運行它,而不輸出管道,以更少,這個消息最後出現。當我輸出到較少時,輸出神奇地首先出現。

有人可以解釋一下嗎?

我確定當詳細消息轉到標準輸出時,錯誤消息轉到標準錯誤。但是,即使我這樣做:

./svnfixversion ./ 1.5 --verbose 2>&1 | less 

輸出是不同的,當我剛剛離開|減。如果stderr被重定向到stdout,那麼不應該更少地保存命令嗎?

+1

'less'不會保留它接收的訂單;但是,不能保證在首先寫入管道時shell如何交錯標準錯誤和標準輸出。 – chepner

回答

3

當你運行:

./svnfixversion ./ 1.5 --verbose 

stdout是行緩衝,stderr是非緩衝。

在:

./svnfixversion ./ 1.5 --verbose 2>&1 | less 

stdout完全緩衝,stderr是非緩衝的。

./svnfixversionFILE* stdout的緩衝模式是什麼使這兩種情況下的輸出不同。

如果希望第二輸出是相同的,以第一個,設置stdout緩衝模式,以符合stdbuf應用緩衝:

stdbuf --output=L ./svnfixversion ./ 1.5 --verbose 2>&1 | less 

在現代bash可以用更短的|&替換2>&1 |


引擎蓋下會發生什麼事,是在節目開始之前main()被稱爲glibc電話isatty(STDOUT_FILENO)確定stdout是否連接到一個終端。如果是這樣,stdout是行緩衝,否則完全緩衝。 stderr始終無緩衝。

+0

我知道stderr沒有緩衝,但我從來沒有聽說過線緩衝與完全緩衝...非常感謝! –

相關問題