Bash进程替换重定向疑问:无递归及输出fine的原因解析
问题分析与解答
命令示例
$ zzz > >(echo fine) 2> >(echo error >&2) fine error
执行上述Bash命令后输出了fine和error,但预期是持续输出error到终端,同时不解为何会输出fine,以下是两个核心问题的解答:
1. 为何未发生递归?
进程替换>(...)会创建独立的子进程,每个子进程拥有自己的文件描述符表:
- 原shell将
zzz的stderr重定向到>(echo error >&2)子进程的stdin; - 子进程里的
echo error >&2,这里的>&2指向的是子进程自身的stderr,而非原shell重定向后的管道。子进程的stderr默认继承原shell的终端,所以echo error的内容会直接输出到终端,不会回写到原shell的stderr管道,自然不会产生递归循环。
2. 为何会输出fine?
进程替换的执行时机是原命令zzz启动前:
- shell会先创建管道,启动
>(echo fine)对应的子进程并执行echo fine命令。这个子进程的stdout默认继承原shell的终端,所以不管zzz有没有往stdout输出内容,echo fine都会执行并输出到终端; zzz是无效命令,确实不会往stdout写数据,但这不影响>(echo fine)子进程的执行——它本身就是独立启动的,不需要等待原命令的输出触发。
内容的提问来源于stack exchange,提问作者Logan Lee
相关产品推荐
相关产品推荐

