Asa*_*vic 15 pipe background-process stdin
如果我想在屏幕上显示“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
Run Code Online (Sandbox Code Playgroud)
来自 (3) 和 (4) 的结论 -> 分离的进程仍然具有可以控制、使用、重定向...的连接输出,但不能输入!
我的问题是:有人明白第 (5) 行的工作原理和方式吗???
... "<&0" 是 "0<&0" 的缩写,为什么将 0 重定向到 0 是解决方案,以及分离进程的输入背后真正发生了什么。Subshell 不是问题,使用大括号 {...} 而不是 (...) 提供相同的结果。
...和问题 2:是否有比第 (6) 行更好的“向分离进程提供输入”的解决方案。
Sté*_*las 13
是的,按照 POSIX 的要求,在后台启动的命令&
的标准输入从/dev/null
.
而且确实
{ cmd <&3 3<&- & } 3<&0
Run Code Online (Sandbox Code Playgroud)
是解决它的最明显的方法。
目前尚不清楚为什么要在后台运行部分管道。