我正在遵循Advaced Bash Guide,IO重定向的示例,该示例显示“仅将stderr重定向到管道”。我理解它是如何工作的,除非它接近fd 3。 当最后一个命令关闭时,为什么它需要在每个命令中关闭fd 3?是全局的?
exec 3>&1
ls -l 2>&1 >&3 3>&- | grep bad 3>&-
exec 3>&-
答案 0 :(得分:3)
在shell中,最初你有1:terminal,2:terminal。然后重复1,使3:终端。 执行ls时,继承文件描述符,但管道替换第一个,因此你有1:pipe,2:terminal,3:terminal;然后重定向使它成为1:终端,2:管道,(3:关闭)。同时,grep有0连接到管道,并继承1:terminal,2:terminal,3:terminal,但重定向将其转换为1:terminal,2:terminal,(3:closed)。 最后,回到shell中,3关闭,返回初始状态1:terminal,2:terminal。
要理解的是,文件描述符在分叉进程时继承,但从那时开始独立,因此每个进程的描述符3必须单独关闭。在这种情况下,为ls和grep打开它可能没什么坏处,但是为了整洁它无论如何都是关闭的。