exec 3 是 exec 命令对文件描述符 3 的重定向操作,用于创建、重定向或关闭自定义 fd,不替换 shell,永久修改当前进程 i/o;支持读(3)、复制(4&1)和关闭(3

Linux 中的 exec 3 并不是一条独立命令,而是 exec 命令配合文件描述符 3 的重定向操作,用于创建、重定向或关闭自定义文件描述符。它属于 exec 的“文件描述符操作模式”,不会替换当前 Shell,而是永久修改当前 Shell 进程的 I/O 资源,后续命令可复用该描述符。
创建并读取文件描述符 3(输入)
执行 exec 3 会以只读方式打开 <code>filename,并将它绑定到文件描述符 3。此后可用 read -u 3 或 cat 从该描述符读取内容。
- 示例:
exec 3 —— 读取主机名并输出 - 注意:文件描述符 3 一旦打开,就持续有效,直到显式关闭或 Shell 退出
创建并写入文件描述符 3(输出)
执行 exec 3> filename 会清空(或新建)filename,并把 fd 3 指向它。之后所有发往 &3 的输出都会写入该文件。
- 示例:
exec 3> log.txt; echo "start" >&3; date >&3—— 写入多行日志 - 与
exec > log.txt不同,fd 3 是额外通道,不影响 stdout(fd 1)的默认行为
复制、重定向与关闭描述符 3
fd 3 可被复制、重定向,也必须及时关闭以防资源泄漏。
exec 4:将 fd 3 复制给 fd 4(两者指向同一打开文件)exec 3:立即关闭 fd 3(强烈建议在不再需要时执行)-
exec 3>&1:让 fd 3 指向当前 stdout(常用于临时备份标准输出)
典型组合技巧:临时捕获输出而不干扰主流程
想把某条命令的输出单独存档,又不改变脚本其余部分的输出目标?可以用 fd 3 实现隔离:
exec 3> debug.logecho "debug: $(date)" >&3-
some_command 2>&3# 把错误输出也送进 debug.log exec 3 # 清理











