假设我们有一个简单的管道:
a | b
比如说,a
退出 - 有没有一种可靠的方法可以b
在任意时间内保持活动状态(以完成任务等)。
答案1
b
不会因终止而a
终止。
$ { echo hello; } | { read message; printf 'got "%s"\n' "$message"; sleep 5; echo "ok, I'm done"; }
got "hello"
ok, I'm done
在这里,a
(echo hello
)将简单地输出一个字符串并终止。管道 ( ) 的右侧b
将读取字符串,输出它,休眠一段时间,然后echo
在终止之前执行最后的操作。
如果b
在终止时终止a
,它将永远没有时间做它需要做的事情。唯一的事情b
不能这里要做的是从标准输入中读取更多数据(read
最后的额外数据将立即获得文件结尾)。
在里面其他场景(问题中未提及),如果它尝试写入其标准输出(跨到不存在的进程)并从中终止(默认情况下),则b
终止之前将收到一个信号。a
a
PIPE
b
如果它没有尝试写入管道,a
将继续运行直到完成。