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