2010-08-12 124 views
42

有沒有辦法在沒有輸出緩衝的情況下運行shell命令?如何使輸出的任何shell命令無緩衝?

例如,hexdump file | ./my_script只會將緩衝塊中的輸入從hexdump傳遞到my_script,而不是逐行傳遞。

其實我想知道一個通​​用的解決方案如何使任何命令無緩衝?

+1

更upvoted問題http://unix.stackexchange.com/questions/25372 – 2016-06-10 20:20:27

回答

9

AFAIK,你不能沒有醜陋的黑客做它。寫入管道(或從中讀取數據)會自動啓用完全緩衝,並且您無能爲力:-(。「線路緩衝」(這是您想要的)僅在讀取/寫入終端時使用。醜陋的黑客究竟做到這一點:他們的程序連接到一個僞終端,使管內的其他工具讀取從行緩衝模式終端/寫整個問題說明如下:。

頁也有一些建議(前述的「醜陋的黑客」)做什麼,即使用unbuffer或拉一些技巧與LD_PRELOAD

+0

感謝。我以前從來沒有聽說過僞終端。 – bodacydo 2010-08-12 16:07:49

14

您也可以使用script命令使的輸出hexdump行緩衝( hexdump將在僞終端中運行,該終端使hexdump認爲它將stdout寫入終端,而不是管道)。

# cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/ 
stty -echo -onlcr 
script -q /dev/null hexdump file | ./my_script   # FreeBSD, Mac OS X 
script -q -c "hexdump file" /dev/null | ./my_script # Linux 
stty echo onlcr 
+0

我用-f參數來刷新,不確定如果必要但它的工作。 – 2013-10-24 01:43:50

+0

在我的情況下,'stdbuf'失敗,但腳本就像一個魅力。程序緩衝輸出到「tee」時的輸出,但不在終端中運行時輸出。所以,腳本的作品!謝謝! – TerrenceSun 2016-05-18 12:11:49

+0

非常聰明的解決方案,它的工作原理!謝謝。 :smile: – xmnboy 2017-03-01 01:26:50

85

嘗試stdbuf,包括在GNU的coreutils,因此幾乎所有的Linux發行版。這爲輸入,輸出和錯誤緩衝器長度爲零:

stdbuf -i0 -o0 -e0 command 
+6

這對我來說比'unbuffer'更好。 'stdbuf'傳遞了任何信號(在我的例子中爲'SIGUSR2'),我發送給'command'(這正是我想要發生的),而'unbuffer'似乎並不想要。 – ElDog 2015-04-11 13:13:49

+0

更多upvoted答案http://unix.stackexchange.com/a/25378/5510 – 2016-06-10 20:20:13

+2

stdbuf使用上述LD_PRELOAD技巧來做到這一點,因此不適用於靜態鏈接或setuid可執行文件。看到這個問題的討論:http:// stackoverflow。com/questions/13644024/stdbuf-with-setuid-capabilities/18624182#18624182 – 2016-07-04 20:45:24