2013-06-28 23 views
2

假設我有在bash下面的命令:如何在Bash中添加流?

one | two 

one運行很長一段時間內生產輸出和two流進行對流的每一行的快速操作,但two不會在所有的工作除非它讀取的第一個值告訴它每行讀取多少個值。 one不輸出該值,但我知道它是什麼(假設它是15)。我想在輸出one之前通過管道發送15\n。我不想修改onetwo

我首先想到的是要做到:

echo "$(echo 15; one)" | two 

這給了我正確的輸出,但它並不通過管道在所有流,直到命令one結束。我希望輸出通過管道立即開始流式處理,因爲執行需要很長時間(幾個月)。

我也試過:

echo 15; one | two 

其中,當然,輸出15,但不通過管道發送到two

在bash中是否有方法通過管道傳遞'15 \ n',然後通過同一個管道開始輸出one的輸出?

+3

你試過分組? '{回聲15;一; } |兩個' –

回答

11

你只需要外殼分組構造:

{ echo 15; one; } | two 

周圍的括號和尾隨分號的空間是必需的。

測試:

one() { sleep 5; echo done; } 
two() { while read line; do date "+%T - $line"; done; } 
{ printf "%s\n" 1 2 3; one; } | two 
16:29:53 - 1 
16:29:53 - 2 
16:29:53 - 3 
16:29:58 - done 
+0

我只是因爲你提到了''''''''''括號內的空格和尾部的分號是必需的(這可能是另一個問題的目的),我沒有。 ':)' –

2

你可以使用sed做到這一點:

例子「一個」腳本,發出每秒一行來展示它是行緩衝和運行。

#!/bin/bash 
while [ 1 ]; do 
    echo "TICK $(date)" 
    sleep 1 
done 

然後通過這個sed命令,請注意,對於您的具體示例'ArbitraryText'將是字段數。我使用了ArbitraryText,因此很明顯這是插入的文本。在OSX,-l是緩衝與GNU桑達我相信這是-u

$ ./one | sed -l '1i\ 
> ArbitraryText 
> ' 

這樣做是什麼,它指示的sed處理文件的其餘部分之前插入一行,其他的一切都會通過不變。

最終結果進行處理線由行無塊緩衝(或者,等待輸入腳本來完成)

ArbitraryText 
TICK Fri Jun 28 13:26:56 PDT 2013 
...etc 

你應該能夠就通過管道將進入「兩節」,你會一般。