2014-10-07 71 views
1

我的代碼如下:改變bash的IO緩衝設置

mkfifo test.pipe 
# execute another program at this point. it reads test.pipe(readonly), and falls asleep. 
# the program will respond line by line. 
exec 4>test.pipe 
echo hello world >&4 

但是我發現該程序不響應,因爲在FD 4hello world不會被清理。我認爲bash使用塊緩衝區打開這個文件,所以即使我在這裏有\n,消息也不會被刷新。

所以我的問題是,如何使4不緩衝或行緩衝?

通知,我不喜歡

echo hello world! >test.pipe 

因爲程序會讀取EOF,這不是我的期望。

UPDATE:

或任何其他方式,我只是不想上節目側EOF發生得頻繁(額外的檢查突發其他)。

+0

'stdbuf'命令不禁? (缺點 - 必須將其包括到每個輸出重定向中) – jm666 2014-10-07 21:20:58

+0

@ jm666僅適用於標準io?如何在這裏處理我的需求? – HuStmpHrrr 2014-10-07 21:23:45

+0

'(echo hello world>&4)'應該確保消息被刷新,但是是一個相當大的錘子(子殼)來修復一個小螺母。我假設'另一個程序'在後臺運行,否則不會阻止'exec'和'echo'執行。 – 2014-10-07 21:41:31

回答

1

不明白的問題,因爲以下

mkfifo test.pipe 

sed 's/.*/i am the sed>>&<</' < test.pipe & #pipe reader in bg 

exec 4>test.pipe 

for i in {1..5} 
do 
echo "$i to pipe wihout NL sleeping 2 secs" 
echo -n hello world $i >&4 
sleep 2 
echo "now the NL - and the sed responds" 
echo >&4 
sleep 0.5 
echo ===== 
done 

sed immediatelly作出響應,得到\n

+0

真的嗎?!我使用8字節消息循環1024次以讓對方接收我的數據。 – HuStmpHrrr 2014-10-07 23:06:55

+0

我開始認爲也許我的系統上的bash被搞砸了。 – HuStmpHrrr 2014-10-07 23:19:21