我有兩個(UNIX)程序A和B從stdin/stdout讀取和寫入。在shell/bash中連接兩個命令之間的輸入_and_output
我的第一個問題是如何A的標準輸出連接到B 和 B相對於A的標準輸入標準輸出的標準輸入,即,像A | B而是一個雙向管道。我懷疑我可以通過using exec to redirect來解決這個問題,但我無法完成它的工作。這些程序是交互式的,所以臨時文件不起作用。
第二個問題是,我想通過記錄程序到stdout複製每個方向和管重複這樣我可以看到,程序之間傳遞(基於文本的線)的流量。如果我可以解決第一個問題,那麼在這裏,我可能會開球>(...)。
這兩個問題似乎是,他們應該有衆所周知的解決方案,但我沒能找到任何東西。
我寧願POSIX殼溶液,或至少一些在bash在Cygwin上工作。
感謝您的回答,我提出了以下解決方案。 A/B命令使用nc來偵聽兩個端口。日誌程序使用sed(使用-u進行無緩衝處理)。
bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
| tee "$fifodir/echoAtoB" \
| nc -l -p 47001 \
| tee "$fifodir/echoBtoA" > "$fifodir/loopback"
這聽取連接到端口47001和47002和回聲所有流量到標準輸出。
在殼2做:
bash-3.2$ nc localhost 47001
在殼3做:
bash-3.2$ nc localhost 47002
現在線在殼2中輸入將被寫入到殼3並且反之亦然,交通記錄到外殼1 ,是這樣的:
B->A: input to port 47001
A->B: input to port 47002
上面已經在Cygwin
測試更新:上面的腳本幾天後停止工作(!)。顯然它可能會陷入僵局。答案中的一些建議可能更可靠。
twinpipe還配備了使用由他人建議的命名管道的方法shell腳本。 謝謝 – 2008-09-26 13:50:51