bash - tee 挂在 bash 中——是否有替代语法?
问题描述
假设您有一系列不属于您的脚本,因此无法修改,它们可能会在不重定向 stdout 和 stderr 的情况下生成后台进程。我注意到在 bash 中,如以下示例所示,如果后台进程仍在运行(并且具有标准输出或标准错误的打开文件描述符),则在脚本完成时不会返回输出。
./runme.sh 2>&1| tee runme.out
其中runme.sh
定义为:
#!/bin/bash
# Start a fake daemon
perl -e 'while(1) { sleep(1) }' &
printf "Enter your name: "
read name
echo "Goodbye $name"
如何在 bash 中运行这样的脚本,同时捕获所有输出并在脚本完成后返回提示?
解决方案
替代语法可能是使用进程替换
./runme.sh > >(tee runme.out) 2>&1
这种方式tee
不再是当前 shell 的子进程,shell 将只等待runme.sh
终止,而在管道中它正在等待所有进程终止。
请注意,和子进程在终止tee
后仍在运行。runme.sh
推荐阅读
- apache-kafka - 我可以配置 Kafka Streams 内部主题 avro 模式主题名称 stategy 吗?
- java - 使用 Criteria api 查找半径内的坐标
- php - codeigniter:一切正常。仅针对一张表,显示错误“表不存在”。它存在于数据库中,也可以在本地主机上正常工作
- tensorflow - 如何识别“.tflite”转换过程的tensoflow模型的输入和输出数组?
- postgresql - 有多少用户在 n 天内有 2 次或更多交易,甚至没有跳过一天
- python - 在 Django REST Framework 中,如何获取上一页隐藏输入发送的“查询参数”?
- asp.net-mvc - 如何检查启用自定义发票编号是否会导致重复的发票编号
- javascript - 切换到深色模式时更改主题颜色
- javascript - 如何使用广告牌js做饼图加载动画
- javascript - 如何在 Vuejs 中从子级向父级 $emit 以重置数据列表