Bash 脚本不会将输入重定向到子进程

发布于 2024-11-19 02:21:26 字数 261 浏览 3 评论 0原文

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

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

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

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

Here's a simplified example of a script I'm writing (doesn't work as is).

I want to direct STDOUT from my script to the STDIN of a subprocess.

In the example below I'm writing 'test' to STDOUT and want that to get to the subprocess which ultimately writes it to the file output.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

左岸枫 2024-11-26 02:21:26

此类事情的(半)标准技术是:

#!/bin/sh

test -t 1 && { $0 ${1+"$@"} | cat > /tmp/output; exit; }
...

如果脚本在 tty 上使用 stdout 运行,则重新运行
输出通过管道传送给猫。

A (semi) standard technique for this sort of thing is:

#!/bin/sh

test -t 1 && { $0 ${1+"$@"} | cat > /tmp/output; exit; }
...

If the script is run with stdout on a tty, it is re-run
with output piped to the cat.

挽袖吟 2024-11-26 02:21:26

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

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

In bash, you can use process substitution to create the subprocess and exec to redirect the script's output:

#!/bin/bash
exec > >( cat >/tmp/output )
while true; do echo test; sleep 1; done
韶华倾负 2024-11-26 02:21:26

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

while true
do
    echo test >> /tmp/output
    sleep 1
done

The example is bizarre. Do you want the echo test stdout to be appended to /tmp/output? If so,

while true
do
    echo test >> /tmp/output
    sleep 1
done
讽刺将军 2024-11-26 02:21:26

最终的解决方案,感谢 @jon 指向 coproc 的指针:

#!/bin/bash
coproc CPO { cat >/tmp/output; }
while true; do echo test >&${CPO[1]}; sleep 1; done

实际上,“echo 测试”被替换为一系列复杂的监视和解析文件的序列,cat 子进程被替换为到服务器的 netcat,并且该连接被监视netcat 进程退出时的陷阱。

感谢所有精彩的答案!

The ultimate solution, thanks to @jon's pointer to coproc:

#!/bin/bash
coproc CPO { cat >/tmp/output; }
while true; do echo test >&${CPO[1]}; sleep 1; done

In reality 'echo test' is replaced with a complex sequence of monitoring and parsing of a file, and the cat subprocess is replaced with a netcat to a server and that connection is monitored with a trap on the netcat process exiting.

Thanks for all the great answers!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文