2015-04-07 171 views
2

我試圖使用過程中替換的標準輸出在while循環是這樣的:BASH嵌套進程替換

#!/bin/bash 

FILE_1=f1.txt 
FILE_2=f2.txt 

while read LINE; do 
    echo "$LINE" 
done < <(paste <(tail -f "$FILE_1") <(tail -f "$FILE_2")) 

什麼它應該做的是合併FILE_1和FILE_2的最後幾行,每當新數據被添加到文件中。顯然,我想做的不僅僅是在while循環中打印這行,但這是一個很好的例子。

不幸的是,當我運行這個腳本時,它只是坐在終端上,什麼也不做。

運行只是這一行:

paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") 

作品完美,我可以看到終端上的輸出,因爲我在數據添加到文件中。

是否需要使用某些特殊語法才能將stdout傳輸到另一個進程?

我試着做

paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do... 

,但它仍然只是坐在終端。

+0

@Kashyap不,我要做的進程替換了重定向。我不確定什麼<<(...)甚至。 – user3473949

+0

@Kashyap:我找不到任何有關使用<<運算符的信息。你能將我鏈接到聯機幫助頁的相關部分嗎? – user3473949

+4

@ kashyap在這裏混合了文檔,但這裏完全是一條紅鯡魚。刪除此評論主題將是一個很好的前進方向。 – tripleee

回答

5

當標準輸出不是終端時,paste將緩衝其輸出。你的命令有效,它只是在發生任何事情之前需要一定量的輸入。

立刻得到輸出,你可以用stdbuf無緩衝標準輸出:

stdbuf -oL paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do... 
0

我相信你有兩個主要問題。首先,您需要結合使用這裏的字符串,命令替換,以及進程替換來完成您希望的重定向。例如:

while read LINE 
do 
    echo "$LINE" 
done <<< "$(paste <(tail -2 "$FILE_1") <(tail -2 "$FILE_1"))" 

上述命令正常工作。然而,note通過使用tail(例如tail -2)的封閉形式,上面的命令使用來自FILE_1FILE_2的可確定的一組行。我不認爲你可以在這種情況下使用follow選項。我在尋找,但還沒有找到爲什麼的規則。使用--serial選項進行粘貼沒有任何區別。

+0

謝謝,我會考慮使用這些元素的組合。你能解釋爲什麼我嘗試的過程替換不起作用嗎?只需將兩個進程替換作爲輸入的paste命令可以正常工作,那麼如何才能獲得stdout流呢? – user3473949

+0

當然,它讓我讀書和抓我的頭。祝你好運。 –