到目前為止,我知道管道機制是一種連接一系列命令的方法,透過將一個命令的標準輸出連接到下一個命令的標準輸入,直到到達最後一個命令,將其標準輸出與顯示器或檔案連接。
但是,是否可以對命令進行循環,以便最後一個命令的標準輸出連接到第一個命令的標準輸入,並且也許透過使用 tee 以某種方式可以顯示某個輸出的變化值?
答案1
我不確定所有的 shell,但在 Bash 中這是可能的,儘管不能使用未命名的管道。所以不是用|
符號。但是如果您建立一個命名管道:
mkfifo fifo
然後你就可以使用它:
<fifo cat | cat >fifo &
現在管道在背景運行,但不執行任何操作。但如果從管道外部輸送管道:
echo x >fifo
管道將暢通無阻並永遠繼續下去。或直到您排空管道:
cat fifo
輸出將出現一次:
x
為了使這個有點複雜,管道可能是這樣的:
<fifo cat | xargs -I@ echo @x >fifo &
因此它會x
在每次迭代時向輸出添加一個。當然會,但只有在迭代開始後,即管道一解除阻塞,即有東西可讀時。和之前一樣,這可以手動啟動:
echo x >fifo
現在看看top
顯示了什麼。cat
和應該都有相當多的活動xargs
。
x
和之前一樣,如果你排空管道,你應該在終端機看到很多s,管道就會阻塞。
這是一個有效的問題,為什麼管道會被排空。為什麼cat
在終端機中提交的命令在電路中沒有留下任何內容。我不知道這個。
答案2
好吧,你當然可以只創建一個循環並使用變數:
while true; do
a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done
這將保存最後的輸出,該輸出將在開始時再次使用
答案3
作為現有的答案,如果不使用命名管道(使用創建的MKFIFO(1))。但你可以用 C 語言來做;例如這是我的骯髒簡單的實現,甚至沒有等待進程退出。
我希望這個訊息對您有所幫助。