带exec与不带exec的Shell重定向差异:3<&0与exec 3<&0的区别
Bash中
3<&0与exec 3<&0的本质区别 两者核心差异在于作用范围和生命周期,具体如下:
1. 3<&0:命令级临时重定向
这种写法是给紧随其后的单个命令创建临时文件描述符重定向,仅在该命令的执行周期内有效:
- 当你执行
some_command 3<&0时,shell会先为some_command的子进程创建文件描述符3,让它指向当前的标准输入(fd0); - 命令执行完毕后,这个子进程退出,fd3也随之销毁,不会对当前shell的文件描述符表产生任何影响;
- 例子:
# 仅让cat命令使用fd3读取stdin,执行完后fd3消失 cat 3<&0 # 此时执行echo "test" >&3会报错:bash: 3: Bad file descriptor
2. exec 3<&0:shell级永久重定向
这种写法是直接修改当前shell进程的文件描述符表,创建的fd3会一直存在于当前shell会话中,直到你显式关闭:
exec在这里没有指定具体命令,它会直接调整当前shell的文件描述符,让fd3绑定到当前的标准输入(fd0);- 之后在这个shell里执行的所有命令,都可以使用fd3来访问原来的stdin资源;
- 如果你要取消这个绑定,需要执行
exec 3<&-来关闭fd3; - 例子:
# 给当前shell绑定fd3到stdin exec 3<&0 # 后续任何命令都能使用fd3,比如用cat读取 cat <&3 # 手动关闭fd3 exec 3<&-
本质总结
3<&0是临时作用于单个命令的重定向,仅影响命令的子进程,父shell无感知;exec 3<&0是永久作用于当前shell的重定向,直接修改shell自身的文件描述符表,影响所有后续命令。
内容的提问来源于stack exchange,提问作者user20151238
相关产品推荐
相关产品推荐

