2013-12-11 27 views

回答

4

好了,問題是不是tail -f但掛起的awk。當發現EOF時,它意味着終止(使用exit 1)。但是沒有找到EOF; tail -f不會終止,因此沒有EOF。

awk終止,那麼這也會破壞管道,並且tail會收到一個SIGPIPE(它會終止它)。

你必須找到一個不同的條件終止。

編輯:

達到你想要,你可以在後臺啓動tail -f,記住其PID,一旦你不再需要它殺了它是什麼。在後臺運行並在同一時間使用管道是棘手的。這樣做將是使用命名管道的最簡單方法(FIFO):

mkfifo log.pipe 
tail -f log > log.pipe & tail_pid=$! 
awk ... < log.pipe 
kill $tail_pid 
rm log.pipe 
+1

我添加了一個'exit'語句,請參閱更新。 'awk'現在進入'END'子句並且應該退出。但腳本仍然掛着.. –

+0

是的,因爲_your_'tail -f'在方面很奇怪,它不會再寫任何東西。只要它試圖在封閉的管道中寫入內容,它就會終止。但是,由於使用'tail -f'打印變量的這種奇怪的情況顯然不是你的_real_用例,也許你可以告訴我們更多關於你最初嘗試實現的內容。 – Alfe

+0

是的,它涉及到這個職位:http://stackoverflow.com/questions/20500685/tail-f-awk-and-end-tail-once-data-is-found –

1

看來,使用<<<echo "$tvar" | tail -f你想要做什麼,而不是切換?

$> cat test.sh 
#! /bin/bash 

tvar="testing" 
(set -o pipefail && echo "$tvar" | tail -f | awk '{print} END{ exit 1}' ) 
$> ./test.sh 
testing 
$> 

雖然awk不算賬打印任何東西了。

+0

是的,但是如果'tail -f'從文件讀取,它不起作用。例如'tail -f file.txt | awk ..'不起作用.. –

+0

我同意但是這回到了以上所述的@alfe - 沒有收到尾部退出的EOF。因此它始終等待來自文件的更多輸入。 –