是否可以使用管道或其他東西來建立命令循環?

是否可以使用管道或其他東西來建立命令循環?

到目前為止,我知道管道機制是一種連接一系列命令的方法,透過將一個命令的標準輸出連接到下一個命令的標準輸入,直到到達最後一個命令,將其標準輸出與顯示器或檔案連接。

但是,是否可以對命令進行循環,以便最後一個命令的標準輸出連接到第一個命令的標準輸入,並且也許透過使用 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 語言來做;例如這是我的骯髒簡單的實現,甚至沒有等待進程退出。

我希望這個訊息對您有所幫助。

相關內容