1

这是我正在编写的脚本的简化示例(不能按原样工作)。

我想将 STDOUT 从我的脚本定向到子进程的 STDIN。

在下面的示例中,我正在向 STDOUT 写入“测试”,并希望它能够到达最终将其写入文件输出的子进程。

#!/bin/bash
exec 4<&1
( cat >/tmp/output )& <&4
while true; do echo test; sleep 1; done
4

4 回答 4

2

这种事情的(半)标准技术是:

#!/bin/sh

测试 -t 1 && { $0 ${1+"$@"} | 猫 > /tmp/输出;出口; }
...

如果脚本在 tty 上使用 stdout 运行,它会重新运行,并将输出通过管道传输到 cat。

于 2011-07-06T11:43:52.780 回答
1

在 bash 中,您可以使用进程替换来创建子进程并exec重定向脚本的输出:

#!/bin/bash
exec > >( cat >/tmp/output )
while true; do echo test; sleep 1; done
于 2011-07-06T15:01:44.000 回答
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 进程退出时的陷阱进行监控。

感谢所有伟大的答案!

于 2011-07-06T15:32:09.727 回答
0

这个例子很奇怪。您希望将echo test标准输出附加到 /tmp/output 吗?如果是这样,

while true
do
    echo test >> /tmp/output
    sleep 1
done
于 2011-07-06T11:43:44.173 回答