Shell

如何在互連命令之間實現循環數據流?

  • March 31, 2015

我知道兩種類型的命令如何相互連接:

  1. 通過使用管道(將標準輸出放入下一個命令的標準輸入)。
  2. 通過使用 Tee(將輸出拼接成多個輸出)。

我不知道這是否是可能的,所以我畫了一個假設的連接類型:

在此處輸入圖像描述

怎麼可能在命令之間實現循環數據流,例如在這個虛擬碼中,我使用變數而不是命令:

pseudo-code:

a = 1    # start condition 

repeat 
{
b = tripple(a)
c = sin(b) 
a = c + 1 
}

循環 I/O 循環實現tail -f

這實現了一個循環 I/O 循環:

$ echo 1 >file
$ tail -f file | while read n; do echo $((n+1)); sleep 1; done | tee -a file
2
3
4
5
6
7
[..snip...]

這使用您提到的正弦算法實現循環輸入/輸出循環:

$ echo 1 >file
$ tail -f file | while read n; do echo "1+s(3*$n)" | bc -l; sleep 1; done | tee -a file
1.14112000805986722210
.72194624281527439351
1.82812473159858353270
.28347272185896349481
1.75155632167982146959
[..snip...]

在這裡,bc進行浮點數學運算,並且s(...)是正弦函式的 bc 表示法。

使用變數代替相同算法的實現

對於這個特定的數學範例,不需要循環 I/O 方法。可以簡單地更新一個變數:

$ n=1; while true; do n=$(echo "1+s(3*$n)" | bc -l); echo $n; sleep 1; done
1.14112000805986722210
.72194624281527439351
1.82812473159858353270
.28347272185896349481
[..snip...]

引用自:https://unix.stackexchange.com/questions/193441