如何重定向赋值给变量的文件描述符?bash脚本异常排查
Bash 文件描述符捕获问题解答
问题1:不使用eval时如何捕获最后一次echo_fd的输出?
直接让fd变量指向当前的标准错误流(即数字2),而非之前通过exec保存的fdb变量。或者修改echo_fd函数,当需要输出到当前上下文的stderr时,直接使用>&2重定向,而非依赖预先绑定的文件描述符变量。
具体调整示例:
# 最后一次运行时,将fd设置为2而非fdb fd=2 echo_fd "three"
这样输出会直接进入当前被重定向的stderr,从而被2> capture.txt捕获。
问题2:未捕获到输出的原因
当执行exec {fdb}>&2时,bash会复制当前进程的stderr(2号文件描述符)的文件表项,创建一个新的文件描述符(比如10)并将其编号存入fdb变量——这相当于给原始stderr做了一个"快照"。
后续执行./run3 2> capture.txt时,只是修改了当前进程的2号文件描述符,使其指向capture.txt,但fdb对应的那个新文件描述符(比如10)仍然指向最初的stderr(通常是终端)。因此echo_fd通过>&$fd(即>&10)输出的内容会直接发送到原始stderr,不会被2> capture.txt的重定向规则捕获;只有run3进程直接输出到2号文件描述符的内容才会被写入capture.txt。
内容的提问来源于stack exchange,提问作者Albert Camu
相关产品推荐
相关产品推荐

