如何在bash中打破tail -f
?由於這個問題是有關這個問題如何打破bash中的尾部-f命令
tail -f | awk and end tail once data is found
我試過如下:
#! /bin/bash
tvar="testing"
(set -o pipefail && tail -f <<< "$tvar" | awk '{print; exit} END{ exit 1}' )
但腳本仍然掛在tail -f
如何在bash中打破tail -f
?由於這個問題是有關這個問題如何打破bash中的尾部-f命令
tail -f | awk and end tail once data is found
我試過如下:
#! /bin/bash
tvar="testing"
(set -o pipefail && tail -f <<< "$tvar" | awk '{print; exit} END{ exit 1}' )
但腳本仍然掛在tail -f
好了,問題是不是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
我添加了一個'exit'語句,請參閱更新。 'awk'現在進入'END'子句並且應該退出。但腳本仍然掛着.. –
是的,因爲_your_'tail -f'在方面很奇怪,它不會再寫任何東西。只要它試圖在封閉的管道中寫入內容,它就會終止。但是,由於使用'tail -f'打印變量的這種奇怪的情況顯然不是你的_real_用例,也許你可以告訴我們更多關於你最初嘗試實現的內容。 – Alfe
是的,它涉及到這個職位:http://stackoverflow.com/questions/20500685/tail-f-awk-and-end-tail-once-data-is-found –
看來,使用<<<
到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不算賬打印任何東西了。
是的,但是如果'tail -f'從文件讀取,它不起作用。例如'tail -f file.txt | awk ..'不起作用.. –
我同意但是這回到了以上所述的@alfe - 沒有收到尾部退出的EOF。因此它始終等待來自文件的更多輸入。 –
你可以試試['inotifywait'](http://linux.die.net/man/1/inotifywait)嗎? – anishsane