有沒有辦法在沒有輸出緩衝的情況下運行shell命令?如何使輸出的任何shell命令無緩衝?
例如,hexdump file | ./my_script
只會將緩衝塊中的輸入從hexdump傳遞到my_script,而不是逐行傳遞。
其實我想知道一個通用的解決方案如何使任何命令無緩衝?
有沒有辦法在沒有輸出緩衝的情況下運行shell命令?如何使輸出的任何shell命令無緩衝?
例如,hexdump file | ./my_script
只會將緩衝塊中的輸入從hexdump傳遞到my_script,而不是逐行傳遞。
其實我想知道一個通用的解決方案如何使任何命令無緩衝?
AFAIK,你不能沒有醜陋的黑客做它。寫入管道(或從中讀取數據)會自動啓用完全緩衝,並且您無能爲力:-(。「線路緩衝」(這是您想要的)僅在讀取/寫入終端時使用。醜陋的黑客究竟做到這一點:他們的程序連接到一個僞終端,使管內的其他工具讀取從行緩衝模式終端/寫整個問題說明如下:。
頁也有一些建議(前述的「醜陋的黑客」)做什麼,即使用unbuffer
或拉一些技巧與LD_PRELOAD
。
感謝。我以前從來沒有聽說過僞終端。 – bodacydo 2010-08-12 16:07:49
從expect
包中的命令unbuffer
禁止輸出緩衝:
Ubuntu Manpage: unbuffer - unbuffer output
實例:
unbuffer hexdump file | ./my_script
unbuffer似乎合併stdout和stderr的命令雖然...(!) – olejorgenb 2016-05-10 19:57:34
您也可以使用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
我用-f參數來刷新,不確定如果必要但它的工作。 – 2013-10-24 01:43:50
在我的情況下,'stdbuf'失敗,但腳本就像一個魅力。程序緩衝輸出到「tee」時的輸出,但不在終端中運行時輸出。所以,腳本的作品!謝謝! – TerrenceSun 2016-05-18 12:11:49
非常聰明的解決方案,它的工作原理!謝謝。 :smile: – xmnboy 2017-03-01 01:26:50
嘗試stdbuf
,包括在GNU的coreutils,因此幾乎所有的Linux發行版。這爲輸入,輸出和錯誤緩衝器長度爲零:
stdbuf -i0 -o0 -e0 command
這對我來說比'unbuffer'更好。 'stdbuf'傳遞了任何信號(在我的例子中爲'SIGUSR2'),我發送給'command'(這正是我想要發生的),而'unbuffer'似乎並不想要。 – ElDog 2015-04-11 13:13:49
更多upvoted答案http://unix.stackexchange.com/a/25378/5510 – 2016-06-10 20:20:13
stdbuf使用上述LD_PRELOAD技巧來做到這一點,因此不適用於靜態鏈接或setuid可執行文件。看到這個問題的討論:http:// stackoverflow。com/questions/13644024/stdbuf-with-setuid-capabilities/18624182#18624182 – 2016-07-04 20:45:24
更upvoted問題http://unix.stackexchange.com/questions/25372 – 2016-06-10 20:20:27