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

2024-02-18

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

我的第一个问题是如何将 A 的 stdout 连接到 B 的 stdinandB 的标准输出到 A 的标准输入。即,类似 A | B而是双向管道。我怀疑我可以通过以下方式解决这个问题使用 exec 重定向 http://tldp.org/LDP/abs/html/x16834.html但我无法让它发挥作用。这些程序是交互式的,因此临时文件不起作用。

第二个问题是我想复制每个方向并通过日志程序将副本传输到标准输出,以便我可以看到在程序之间传递的(基于文本行的)流量。如果我能解决第一个问题,我可能会逃脱 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上测试过

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


命名管道怎么样?

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

对于你的第二部分,我相信 T 恤是正确的答案。所以就变成了:

# A < foo | tee logfile | B > foo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 shell/bash 中的两个命令之间连接输入和输出 的相关文章

  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • UNIX 中 $@ 和 $* 有什么区别?

    有什么区别 and 在UNIX 中 当在脚本中回显时 它们似乎都会产生相同的输出 请参阅特殊参数下的 bash 手册页 Special Parameters The shell treats several parameters speci
  • 在 scp 的简单函数包装中使用波形符 ~ 时出现问题

    我想放置一个简单的bash功能在我的 bashrc围绕着scp通过接受 源 参数和 目标 参数来命令 到目前为止已经尝试过 function send eval scp 1 user annoyingly long server name
  • 如何在 Win32 中的两个子进程之间设置管道?

    对于我的一生 我无法弄清楚为什么这不起作用 基本上 我创建了继承位设置为 true 的管道 并创建了两个子进程 并使用 STARTUPINFO 结构根据需要设置输入和输出句柄 但管道似乎已损坏 第二个进程没有向其中写入任何输出 控制台 即使
  • Bash:执行命令时超时/文件溢出终止

    我正在用 bash 编写一个模拟评分脚本 它应该执行一个 C 程序 该程序将给出一些输出 我将其重定向到一个文件 我试图 1 使其在一定持续时间后超时 并且 2 如果输出文件到达某个文件则终止尺寸限制 不知道如何解决这两个问题 有什么帮助吗
  • 如何检查特定目录的权限?

    我知道使用ls l directory directory filename 告诉我文件的权限 如何对目录执行相同的操作 我显然可以使用ls l在层次结构中较高的目录上 然后滚动直到找到它 但这太痛苦了 如果我使用ls l在实际目录中 它给
  • 如何在 Mac OS X 中通过给出进程名称来获取进程的 PID?

    我正在编写一个脚本来监视任何给定进程的 CPU 和 MEM 为此 我需要将要监视的进程的名称作为命令行参数发送 例如 monitorscript
  • 为什么 bash for 循环出错?

    我正在尝试使用 for 循环运行以下代码 但出现语法错误 请帮忙 输入格式 输入的第一行包含一个整数N 表示整数的个数 下一行包含 N 个空格分隔的整数 它们构成数组 A read n sum 0 for i 1 i lt n i do r
  • npx:shell-auto-fallback 参数已被删除

    老实说 我不记得我最后在我的机器上安装了什么 我相信它正在酝酿 gatsby cli 无论如何 从昨天早上开始 当我打开新实例或重置终端 打开新选项卡 源 zshrc 等 时 我的终端一直给出以下错误 Last login Tue Nov
  • $@ 中 args 的 bash 参数大小写

    我有一个带有一长串可选参数的脚本 有些具有相关的值 Such as script first 2012 12 25 last 2012 12 26 copy remove script first 2012 12 25 因此有以下案例陈述
  • 查找从 unix 命令行输入的单词出现的次数

    对于文件file1 txt其中包含 Apple fruit Apple tree Tree AApple AApklle Apple apple TREE Apple 我想查找该单词出现的次数Apple 输出应该是4 我的 script s
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • 当我无缘无故地向 Sink 写入数据时,NIO Pipe 抛出“Broken Pipe”!如何调试?

    我相信我所做的一切都是正确的 我创建一个管道 将接收器传递给编写器线程 使用 OP READ 在我的选择器上注册源 启动我的选择器 一切正常 但一旦我向接收器写入一些内容 我就会收到管道损坏异常 为什么 这里没有破损的管道 我烦了 我如何调
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 如何在 shell 中解码 URL 编码的字符串?

    我有一个文件 其中包含已编码的用户代理列表 例如 Mozilla 2F5 0 20 28Macintosh 3B 20U 3B 20Intel 20Mac 20OS 20X 2010 6 3B 20en 我想要一个 shell 脚本 它可以
  • 寻找 shell 重定向交错行为的解释

    给定以下脚本 t sh bin bash if eq 0 then log if gt 0 then printf s n else cat fi tee a logged out else log if gt 0 then printf
  • VBA:如何从 MS Access 运行另一个应用程序

    我一直在试图解决这个问题 但似乎我在任何地方都找不到解决该问题的方法 这是第一部分 VBA Shell 命令始终返回 找不到文件 https stackoverflow com questions 10439024 vba shell co
  • Shell脚本通过curl调用API并处理响应

    我需要创建一个通过curl 调用我的登录API 的shell 脚本 该脚本应该能够存储和处理来自curl api 调用的响应 myscript sh bin bash echo Extract bearer token from curl
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 过滤 stderr 并获取初始返回代码

    在 shell 脚本中 我必须运行一个命令 我需要确定返回码是什么 但事实证明该命令的输出会发送到 stderr 并且还会输出用户的密码 不幸的是 这是命令的一个参数 不好 我知道 我至少想过滤掉密码 使其不被显示回来 cmd OPTION

随机推荐