这是我正在编写的脚本的简化示例(不能按原样工作)。
我想将 STDOUT 从我的脚本定向到子进程的 STDIN。
在下面的示例中,我正在向 STDOUT 写入“测试”,并希望它能够到达最终将其写入文件输出的子进程。
#!/bin/bash
exec 4<&1
( cat >/tmp/output )& <&4
while true; do echo test; sleep 1; done
这是我正在编写的脚本的简化示例(不能按原样工作)。
我想将 STDOUT 从我的脚本定向到子进程的 STDIN。
在下面的示例中,我正在向 STDOUT 写入“测试”,并希望它能够到达最终将其写入文件输出的子进程。
#!/bin/bash
exec 4<&1
( cat >/tmp/output )& <&4
while true; do echo test; sleep 1; done
这种事情的(半)标准技术是:
#!/bin/sh 测试 -t 1 && { $0 ${1+"$@"} | 猫 > /tmp/输出;出口; } ...
如果脚本在 tty 上使用 stdout 运行,它会重新运行,并将输出通过管道传输到 cat。
在 bash 中,您可以使用进程替换来创建子进程并exec
重定向脚本的输出:
#!/bin/bash
exec > >( cat >/tmp/output )
while true; do echo test; sleep 1; done
最终的解决方案,感谢@jon 指向 coproc 的指针:
#!/bin/bash
coproc CPO { cat >/tmp/output; }
while true; do echo test >&${CPO[1]}; sleep 1; done
实际上,'echo test' 被一个复杂的文件监控和解析序列所取代,而 cat 子进程被一个 netcat 所取代,连接到服务器,并且该连接由 netcat 进程退出时的陷阱进行监控。
感谢所有伟大的答案!
这个例子很奇怪。您希望将echo test
标准输出附加到 /tmp/output 吗?如果是这样,
while true
do
echo test >> /tmp/output
sleep 1
done