后台进程管道输入

后台进程管道输入

如果我想在屏幕上显示“aaa”:

(1)$: echo aaa | cat                 ... works OK
(2)$: echo aaa | ( cat )             ... works OK
(3)$: echo aaa | ( cat & )           ... NOT working
(4)$: ( echo aaa & ) | cat           ... works OK 
(5)$: echo aaa | ( cat <&0 & )       ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0  ... works ok in BASH and SH

(3) 和 (4) 的结论 -> 分离的进程仍然具有可以控制、使用、重定向的连接输出......,但没有输入!

我的问题是:有人明白吗第 (5) 行为何以及如何工作???

...“<&0”是“0<&0”的缩写,为什么将 0 重定向到 0 是解决方案,以及分离进程的输入背后到底发生了什么。子 shell 不是问题,使用大括号 {...} 而不是 (...) 提供相同的结果。

...和问题2:是否有比第(6)行更好的“向分离进程提供输入”的解决方案。

答案1

是的,根据 POSIX 的要求,在后台启动的命令&的标准输入从 重定向/dev/null

确实

{ cmd <&3 3<&- & } 3<&0

是解决这个问题最明显的方法。

不过,尚不清楚为什么要在后台运行部分管道。

相关内容