系统相关
首页 > 系统相关> > linux – 将stdin _and_ stdout重定向到管道

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

作者:互联网

我想运行一个程序“A”,让它的输出转到另一个程序“B”的输入,以及stdin转到“B”的输入.如果程序“A”关闭,我希望“B”继续运行.

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

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

但我无法弄清楚如何将stdin组合到输出中.我的猜测是:
./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程序来分叉子进程,每次我想做一些复杂的stdin重定向到管道时做任何复杂的事情).

解决方法:

没有编写辅助程序就无法做到这一点.

通常,stdin可能是只读文件描述符(哎呀,它可能指的是只读文件).所以你不能“插入”任何东西.

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

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

既然你想要的基本上与“tee”相反,我可以称它为“eet”……

[编辑]

如果只有你可以在后台启动“猫”…

但这将失败,因为具有控制终端的后台进程无法从stdin读取.所以,如果你可以从控制终端分离“猫”并在后台运行它…

在Linux上,“setsid cat”应该粗略地做到这一点.但是(a)我无法让它工作得很好而且(b)我今天真的没有时间和(c)无论如何它都是非标准的.

我只想编写帮助程序.

[编辑2]

好的,这似乎有效:

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

set -m thing强制bash启用作业控制,这显然需要防止shell从/ dev / null重定向stdin.

这里,echo HELLO代表你的“程序A”. seq命令(中间的睡眠)只是提供一些输入.是的,你可以将整个事情传递给进程B.

关于丑陋和不便携的解决方案,你可以要求……

标签:linux,shell,redirect,io-redirection
来源: https://codeday.me/bug/20190903/1796378.html