当前位置:  开发笔记 > 编程语言 > 正文

在shell/bash中连接两个命令之间的输入_and_output

如何解决《在shell/bash中连接两个命令之间的输入_and_output》经验,为你挑选了3个好方法。

我有两个(UNIX)程序A和B,它们从stdin/stdout读取和写入.

我的第一个问题是如何A的标准输出连接到B的标准输入 B的AIE,像A的标准输入标准输出| B但是双向管道.我怀疑我可以通过使用exec重定向来解决这个问题,但我无法让它工作.程序是交互式的,因此临时文件不起作用.

第二个问题是我想复制每个方向并通过日志记录程序将副本传递给stdout,以便我可以看到在程序之间传递的(基于文本行的)流量.如果我能解决第一个问题,我可以在这里使用tee>(...).

这两个问题似乎都应该是众所周知的解决方案,但我无法找到任何东西.

我更喜欢POSIX shell解决方案,或者至少在cygwin上使用bash工作的东西.

感谢您的回答,我提出了以下解决方案.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的连接,并将所有流量回显到标准输出.

在shell 2中做:

bash-3.2$ nc localhost 47001

在shell 3中做:

bash-3.2$ nc localhost 47002

现在在shell 2中输入的行将被写入shell 3,反之亦然,并且流量记录到shell 1,类似于:

B->A: input to port 47001
A->B: input to port 47002

以上内容已在Cygwin上测试过

更新:上面的脚本在几天后停止工作(!).显然它可以陷入僵局.答案中的一些建议可能更可靠.



1> sherbang..:

命名管道怎么样?

# mkfifo foo
# A < foo | B > foo
# rm foo

对于你的第二部分,我相信tee是正确的答案.所以它变成:

# A < foo | tee logfile | B > foo



2> JeeBee..:

http://bisqwit.iki.fi/source/twinpipe.html



3> Aaron Maenpa..:

您可能可以使用命名管道:

mkfifo pipe
gawk '$1' < pipe | gawk '$1' > pipe

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有