这是我正在编写的脚本的简化示例(不能按原样运行)。
我想将STDOUT从我的脚本导向子进程的STDIN。
在下面的例子中,我正在向STDOUT写'test',并希望它到达最终将其写入文件输出的子进程。
#!/bin/bash
exec 4<&1
( cat >/tmp/output )& <&4
while true; do echo test; sleep 1; done
答案 0 :(得分:2)
这种事情的(半)标准技术是:
#!/bin/sh test -t 1 && { $0 ${1+"$@"} | cat > /tmp/output; exit; } ...
如果脚本在tty上使用stdout运行,则会重新运行 输出用管道传送给猫。
答案 1 :(得分:2)
您还可以尝试使用命名管道(fifos)设置简单的客户端 - 服务器系统。
参见:Send command to a background process(附带参考资料)
答案 2 :(得分:1)
在bash中,您可以使用进程替换来创建子进程,并使用exec
来重定向脚本的输出:
#!/bin/bash
exec > >( cat >/tmp/output )
while true; do echo test; sleep 1; done
答案 3 :(得分:0)
这个例子很奇怪。你想将echo test
标准输出附加到/ tmp / output吗?如果是的话,
while true
do
echo test >> /tmp/output
sleep 1
done
答案 4 :(得分:0)
最终解决方案,感谢@ jon指向coproc的指针:
#!/bin/bash
coproc CPO { cat >/tmp/output; }
while true; do echo test >&${CPO[1]}; sleep 1; done
实际上,'echo test'被替换为一个复杂的监视和解析文件序列,cat子进程被netcat替换为服务器,并且该连接在netcat进程退出时被监视。 / p>
感谢所有出色的答案!