Shell
如何在互連命令之間實現循環數據流?
我知道兩種類型的命令如何相互連接:
- 通過使用管道(將標準輸出放入下一個命令的標準輸入)。
- 通過使用 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...]