首页 理论教育 exec命令与文件描述符

exec命令与文件描述符

时间:2023-11-18 理论教育 版权反馈
【摘要】:exec不启动新的shell,而用被执行的命令替换当前的shell进程,并且将老进程的环境清理掉,exec命令后的其他命令将不再执行。因为,当第一条命令exec echo运行后,脚本exec_echo_test.sh的子shell退出了,所以第二条exec echo命令不运行。当exec命令用来对文件描述符操作的时候,像其他普通命令一样,不会替换当前shell,格式如下:表3-6 exec命令与文件描述符exec与重定向及文件描述符相关的命令见表3-6。

exec命令与文件描述符

Bash的内置命令exec的常用格式如下:

978-7-111-48202-4-Chapter03-141.jpg

即,exec加命令及其选项和参数。exec不启动新的shell,而用被执行的命令替换当前的shell进程,并且将老进程的环境清理掉,exec命令后的其他命令将不再执行。例如,在一个shell窗口里面运行exec date,将显示当前的日期和时间,然后,shell窗口马上就退出或关闭了(几乎还没看清date命令的显示结果,就退出了)。这是因为shell窗口的进程已经被替换为仅仅执行date命令的一个进程,date运行结束,shell自然就退出了。所以,很少在命令行把一条普通命令放在exec的后面。下面试着在脚本里使用exec。先看一个脚本。

978-7-111-48202-4-Chapter03-142.jpg

脚本echo_test.sh只有两条echo命令,运行结果如下:

978-7-111-48202-4-Chapter03-143.jpg

如果把两条echo前面都加上exec,得到脚本exec_echo_test.sh:

978-7-111-48202-4-Chapter03-144.jpg

运行它,看看会怎样:

978-7-111-48202-4-Chapter03-145.jpg

只有第一条命令运行了。因为,当第一条命令exec echo运行后,脚本exec_echo_test.sh的子shell退出了,所以第二条exec echo命令不运行。通过这个例子可知,在脚本里面,也不能随意使用命令exec。

当exec命令用来对文件描述符操作(用来重定向)的时候,像其他普通命令一样,不会替换当前shell,格式如下:

978-7-111-48202-4-Chapter03-146.jpg

表3-6 exec命令与文件描述符

978-7-111-48202-4-Chapter03-147.jpg

exec与重定向及文件描述符相关的命令见表3-6。

下面讲解exec<file的使用。先看一个包含三行命令的文件exec_test.txt:

978-7-111-48202-4-Chapter03-148.jpg

可以用source命令或者点命令运行它:

978-7-111-48202-4-Chapter03-149.jpg

运行exec<exec_test.txt,也能得到三条命令的运行结果,但还没来得及看清楚,shell窗口就关闭了:

978-7-111-48202-4-Chapter03-150.jpg

下面讲解exec>file的作用。运行exec>file之后,当前shell的任何命令的输出不再显示在终端屏幕,而是重定向到文件file,试试就知道了:

978-7-111-48202-4-Chapter03-151.jpg

以上运行exec>exec_out.txt之后,又执行了三条命令,屏幕上没有显示,应该是重定向到了文件exec_out.txt,但不能查看该文件:

978-7-111-48202-4-Chapter03-152.jpg

不能查看的原因是:文件exec_out.txt是cat命令的输入参数,cat命令试图将文件的内容显示出来,而当前shell的任何命令的输出都已重定向到文件exec_out.txt,于是命令cat exec_out.txt试图将文件exec_out.txt的内容重定向到文件exec_out.txt中,导致cat命令的输入文件与输出文件是同一个文件(提示信息为cat:exec_out.txt:input file is output file),所以,运行catexec_out.txt失败。

那么,如何做才能查看文件exec_out.txt呢?有两种方法。第一种方法,重新打开一个shell窗口,即可查看,因为命令exec>exec_out.txt只对当前shell起作用;第二种方法,将当前shell的命令输出,重定向到终端屏幕,即/dev/tty,还原默认设置:

978-7-111-48202-4-Chapter03-153.jpg

这时,就可以查文件exec_out.txt了。前面执行的三条命令的结果,都存入到文件exec_out.txt中:

978-7-111-48202-4-Chapter03-154.jpg

下面讲解execm<file和command<&m的使用。命令exec3<exec_out.txt是将文件exec_out.txt读入到文件描述符3中(注意3与<之间不能有空格):

978-7-111-48202-4-Chapter03-155.jpg

下面的命令cat<&3的意思是,将文件描述符3作为cat命令的输入,相当于运行cat exec_out.txt(注意<与&之间不能有空格,&与3之间有无空格均可):(www.xing528.com)

978-7-111-48202-4-Chapter03-156.jpg

这时,进入/dev/fd目录,可以查看到文件描述符3:

978-7-111-48202-4-Chapter03-157.jpg

下面讲解execm>file和command>&m的使用。命令exec5>exec_5.txt的作用是,将写入文件描述符5的内容重定向到文件exec_5.txt中:

978-7-111-48202-4-Chapter03-158.jpg

下面的两条命令都重定向到文件描述符5,所以两条命令的执行结果都不显示在屏幕上,而是重定向到文件描述符5对应的文件exec_5.txt之中:

978-7-111-48202-4-Chapter03-159.jpg

严格地说,第一条命令pwd的结果重定向到了文件exec_5.txt,第二条命令echo的结果追加重定向到了文件exec_5.txt(如果接下来还有其他命令,命令的运行结果都会追加重定向到文件exec_5.txt,而不是重定向到文件exec_5.txt)。现在,查看文件exec_5.txt,可见它存放着前面两条命令的执行结果:

978-7-111-48202-4-Chapter03-160.jpg

978-7-111-48202-4-Chapter03-161.jpg

下面讲解execn<&m和execm<&-的使用。刚刚建立了文件描述符5,命令exec6<&5创建了文件描述符5的副本—文件描述符6:

978-7-111-48202-4-Chapter03-162.jpg

下面的echo命令重定向到文件描述符6:

978-7-111-48202-4-Chapter03-163.jpg

此时,重定向到文件描述符6和重定向到文件描述符5效果一样,上面echo命令的执行结果存入了文件exec_5.txt中:

978-7-111-48202-4-Chapter03-164.jpg

execm<&-的作用是关闭文件描述符m。例如,将前面建立的文件描述符5关闭,命令pwd再重定向到文件描述符5时会失败:

978-7-111-48202-4-Chapter03-165.jpg

现在,文件描述符5没有了,但它的副本—文件描述符6,仍然可以使用:

978-7-111-48202-4-Chapter03-166.jpg

命令exec>&-的作用是关闭标准输出。命令原本都可以正常屏幕输出,在关闭标准输出后,则不能正常运行,例如:

978-7-111-48202-4-Chapter03-167.jpg

因为标准输出(屏幕)被关闭了,date的结果没有地方可以显示。还原标准输出,命令就可以正常运行了:

978-7-111-48202-4-Chapter03-168.jpg

978-7-111-48202-4-Chapter03-169.jpg

命令exec<&-的作用是关闭标准输入,运行它的话,还没来得及看清楚,当前shell就退出了:

978-7-111-48202-4-Chapter03-170.jpg

前面的例子使用了文件描述符3、5和6。那么,文件描述符的最大值是多少呢?带选项-n的内置命令ulimit可以查询和设置这个值。运行ulimit-n:

978-7-111-48202-4-Chapter03-171.jpg

表示当前shell的可使用的文件描述符有1024个,那么取值范围就是0到1023。下面设置其他整数值试试:

978-7-111-48202-4-Chapter03-172.jpg

该值不是可以任意设置的,最大能设多少与具体的系统有关。例如,在某台计算机上,设置为2048时是成功的,设置为2049或者更大的数值时则失败:

978-7-111-48202-4-Chapter03-173.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈