2011-02-26 241 views
9

我想知道是否有可能告訴bash,echoprintf的所有調用應分別跟蹤stdout/stderr上的fflush()強制外殼腳本flflush

一個快速而骯髒的解決方案是編寫我自己的printf實現,並使用它來代替內置的,但是在我看來,我可能不需要。

我正在寫幾個一次運行的構建腳本,用於調試需求我真的需要看到它們按順序寫入的消息。

+0

不,我知道的,我覺得BASH是完全基於行的,使他們將刷新上一行一行的基礎,但沒有更多。是否有需要不刷新換行符? – 2011-02-26 22:48:14

+0

@Robert - 是的,我必須消除時間錯誤,因此我需要確保每次寫入stderr/stdout都會導致流被刷新。 – 2011-02-26 22:59:25

+0

抓住吸管:我不知道用stty設置什麼會有幫助。或者使用名爲'unbuffer'的'expect'腳本。或者將Bash的'PS4'設置爲包含'$(date「+%s。%N」)'(儘管這裏有一些開銷),並使用'set -x'並對輸出進行排序。也許是使用'trap'foo'DEBUG的東西。 [this](http://www.pixelbeat.org/programming/stdio_buffering/)是否提供任何有用的信息?或者[這裏](http://stackoverflow.com/questions/1507674/how-to-add-timestamp-to-stderr-redirection)? – 2011-02-27 01:30:17

回答

10

如果命令使用stdio並連接到終端,則每行都會刷新它們。 否則,你就需要使用上的命令類似stdbuf在管線中 http://www.pixelbeat.org/programming/stdio_buffering/

TL;博士:不是printf ...嘗試把到腳本stdbuf -o0 printf ..,或stdbuf -oL printf ...

+0

我正在考慮只是獨立實施stdbuf ,我正在處理帶有較舊版本的coreutils的系統的可移植性問題(或者,更簡單的'xxprintf'只刷新給定的流/ fd) – 2011-02-28 10:45:43

+0

似乎唯一的方法是使用stdbuff,實現它自己,如果它不存在。 – 2011-03-15 03:57:48

0

也許「stty的原始」可幫助其他一些技巧來處理行尾處理。 AFAIK「原始」模式關閉基於行的緩衝,至少用於串行端口(「stty raw </dev/ttyS0」)。

1

如果您強制讀取文件,它似乎會導致緩衝區刷新。這些爲我工作。

無論是將數據讀入一個無用的變量:

x=$(<$logfile) 

或做UUOC:

cat $logfile > /dev/null