gpt4 book ai didi

linux - 将 stdin _and_ stdout 重定向到管道

转载 作者:可可西里 更新时间:2023-11-01 11:50:38 24 4
gpt4 key购买 nike

我想运行一个程序“A”,让它的输出进入另一个程序“B”的输入,以及进入“B”的输入的标准输入。如果程序“A”关闭,我希望“B”继续运行。

我可以轻松地将 A 输出重定向到 B 输入:
./一个 | ./b

如果我愿意,我可以将 stderr 合并到输出中:
./a 2>&1 | ./b

但我不知道如何将标准输入合并到输出中。我的猜测是:
./a 0>&1 | ./b
但它不起作用。

这是一个不需要我们重写任何测试程序的测试:

$ echo ls 0>&1 | /bin/sh -i
$ a b info.txt
$
/bin/sh: Cannot set tty process group (No such process)

如果可能的话,我想在命令行上只使用 bash 重定向(我不想编写 C 程序来 fork 子进程并在每次我想对 stdin 进行一些重定向时做任何复杂的事情到管道)。

最佳答案

如果不编写辅助程序,这是无法完成的。

一般来说,stdin 可能是一个只读文件描述符(哎呀,它可能指的是只读文件)。所以你不能向其中“插入”任何东西。

您将需要编写一个“帮助程序”来监视两个文件描述符(例如,0 和 3),以便从两者中读取并“合并”它们。一个简单的 selectpoll 循环就足够了,您可以用大多数脚本语言编写它,但我不认为是 shell。

然后您可以使用 shell 重定向将程序的输出提供给“助手”的描述符 3。

既然你想要的基本上是“tee”的对立面,我不妨称之为“eet”……

[编辑]

要是你能在后台启动“猫”就好了……

但这会失败,因为具有控制终端的后台进程无法从标准输入读取。因此,如果您可以将“cat”与其控制终端分离并在后台运行它...

在 Linux 上,“setsid cat”应该可以大致做到这一点。但是 (a) 我不能让它很好地工作并且 (b) 我今天真的没有时间做这个并且 (c) 它无论如何都是非标准的。

我只会写辅助程序。

[编辑 2]

好的,这似乎可行:

{ seq 5 ; sleep 2 ; seq 5 ; } | /bin/bash -c 'set -m ; setsid cat ; echo HELLO'

set -m 强制 bash 启用作业控制,这显然是防止 shell 从/dev/null 重定向标准输入所必需的。

这里,echo HELLO 代表您的“程序 A”。 seq 命令(中间有 sleep)只是提供一些输入。是的,您可以将这整个过程通过管道传递给进程 B。

关于您可能要求的丑陋且不可移植的解决方案...

关于linux - 将 stdin _and_ stdout 重定向到管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6455847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com