Shell exec命令操作文件描述符
发布时间:2020-12-14 02:16:00 所属栏目:Linux 来源:网络整理
导读:exec 是 Shell 内置命令,它有两种用法,一种是执行 Shell 命令,一种是操作文件描述符。本节只讲解后面一种,前面一种请大家自行学习。 使用 exec 命令可以永久性地重定向,后续命令的输入输出方向也被确定了,直到再次遇到 exec 命令才会改变重定向的方向;
exec 是 Shell 内置命令,它有两种用法,一种是执行 Shell 命令,一种是操作文件描述符。本节只讲解后面一种,前面一种请大家自行学习。 使用 exec 命令可以永久性地重定向,后续命令的输入输出方向也被确定了,直到再次遇到 exec 命令才会改变重定向的方向;换句话说,一次重定向,永久有效。 嗯?什么意思?难道说我们以前使用的重定向都是临时的吗?是的!前面使用的重定向都是临时的,它们只对当前的命令有效,对后面的命令无效。 请看下面的例子: [mozhiyan@localhost ~]$ echo "c.biancheng.net" > log.txt [mozhiyan@localhost ~]$ echo "C语言中文网" C语言中文网 [mozhiyan@localhost ~]$ cat log.txt c.biancheng.net第一个 echo 命令使用了重定向,将内容输出到 log.txt 文件;第二个 echo 命令没有再次使用重定向,内容就直接输出到显示器上了。很明显,重定向只对第一个 echo 有效,对第二个 echo 无效。 有些脚本文件的输出内容很多,我们不希望直接输出到显示器上,或者我们需要把输出内容备份到文件中,方便以后检索,按照以前的思路,必须在每个命令后面都使用一次重定向,写起来非常麻烦。如果以后想修改重定向的方向,那工作量也是不小的。 exec 命令就是为解决这种困境而生的,它可以让重定向对当前 Shell 进程中的所有命令有效,它的用法为: exec 文件描述符操作 在《结合Linux文件描述符谈重定向,彻底理解重定向的本质》一节讲到的所有对文件描述符的操作方式 exec 都支持,请看下面的例子:[mozhiyan@localhost ~]$ echo "重定向未发生" 重定向未发生 [mozhiyan@localhost ~]$ exec >log.txt [mozhiyan@localhost ~]$ echo "c.biancheng.net" [mozhiyan@localhost ~]$ echo "C语言中文网" [mozhiyan@localhost ~]$ exec >&2 [mozhiyan@localhost ~]$ echo "重定向已恢复" 重定向已恢复 [mozhiyan@localhost ~]$ cat log.txt c.biancheng.net C语言中文网对代码的说明:
重定向的恢复类似echo "1234" >log.txt这样的重定向只是临时的,当前命名执行完毕后会自动恢复到显示器,我们不用担心。但是诸如exec >log.txt这种使用 exec 命令的重定向都是持久的,如果我们想再次回到显示器,就必须手动恢复。以输出重定向为例,手动恢复的方法有两种:
下面的例子演示了输入重定向的恢复: #!/bin/bash exec 6<&0 #先将0号文件描述符保存 exec <nums.txt #输入重定向 sum=0 while read n; do ((sum += n)) done echo "sum=$sum" exec 0<&6 6<&- #恢复输入重定向,并关闭文件描述符6 read -p "请输入名字、网址和年龄:" name url age echo "$name已经$age岁了,它的网址是 $url"将代码保存到 test.txt,并执行下面的命令: [mozhiyan@localhost ~]$ cat nums.txt 80 33 129 71 100 222 8 [mozhiyan@localhost ~]$ bash ./test.sh sum=643 请输入名字、网址和年龄:C语言中文网 http://c.biancheng.net 7 C语言中文网已经7岁了,它的网址是 http://c.biancheng.net (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |