我有两个(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