bash/zsh执行重定向操作时会保留哪些文件描述符副本?
解答
- 你观察到的bash的
255u、zsh的10u都是对应shell预留的私有文件描述符,不属于用户可随意使用的fd范围,你提到的“重定向时保留的副本”指的是shell启动时继承到的、与当前交互终端绑定的原始标准输入(0)、标准输出(1)、标准错误(2)的统一备份,不是仅针对标准输出的副本。 - 这个备份的核心作用是保障重定向操作后shell可以正常恢复标准流:
- 当你执行重定向操作时(比如单次命令的
echo test > a.txt,或者全局重定向exec 1> a.txt),shell会修改对应标准fd的指向,临时绑定到目标文件/管道上 - 如果没有提前备份原始的标准流指向,重定向完成后shell就无法找回原来的终端交互句柄,会出现执行完重定向命令后,后续输出没法打印到终端、没法接收用户输入的问题
- 有了这个私有备份fd,shell在重定向逻辑结束后,直接把标准fd重新指向备份fd对应的终端设备,就能快速恢复到初始交互状态
- 当你执行重定向操作时(比如单次命令的
- 你可以自行测试验证:直接打开bash执行
ls -l /proc/$$/fd/255,会看到该fd的指向和当前0、1、2号fd完全一致,都是当前的交互终端设备;执行exec 1> test.txt后查看fd1会指向test.txt,但255号fd依然指向原始终端,执行exec 1>&255即可恢复标准输出到终端。
内容的提问来源于stack exchange,提问作者gejo
相关产品推荐
相关产品推荐

