Bash 脚本不会将输入重定向到子进程
这是我正在编写的脚本的简化示例(不能按原样工作)。
我想将脚本中的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
此类事情的(半)标准技术是:
如果脚本在 tty 上使用 stdout 运行,则重新运行
输出通过管道传送给猫。
A (semi) standard technique for this sort of thing is:
If the script is run with stdout on a tty, it is re-run
with output piped to the cat.
在 bash 中,您可以使用进程替换来创建子进程,并使用 exec 来重定向脚本的输出:
In bash, you can use process substitution to create the subprocess and
exec
to redirect the script's output:这个例子很奇怪。您希望将
echo test
stdout 附加到 /tmp/output 吗?如果是这样,The example is bizarre. Do you want the
echo test
stdout to be appended to /tmp/output? If so,最终的解决方案,感谢 @jon 指向 coproc 的指针:
实际上,“echo 测试”被替换为一系列复杂的监视和解析文件的序列,cat 子进程被替换为到服务器的 netcat,并且该连接被监视netcat 进程退出时的陷阱。
感谢所有精彩的答案!
The ultimate solution, thanks to @jon's pointer to coproc:
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!