最近在看代码的时候看到了很多关于shell重定向的使用,所以特地学习了官方Bash手册,并结合一个网友的博客,在此将内容总结整理一下。
一、shell指令执行的顺序
bash启动的时候会默认打开3个文件描述符,当它运行一条指令的时候,会先fork一个子进程,子进程会继承这3个文件描述符,然后设定好重定向之后,再执行指令。严格按照这个顺序会很容易理解重定向。
需要注意的几点是:
-
如果指令中有多个重定向,重定向的顺序是很关键的,因为重定向是按照从左向右解析的。
-
如果只有一个重定向的话,那么它在指令的位置可以任意,因为bash是先解析重定向,然后将重定向从指令中去除以后再执行指令。
-
重定向符号如果以‘<’开头,是指对标准输入(fd= 0)进行重定向;如果是以'>'开头,则是对标准输出(fd= 1)重定向,这点后面还会继续强调。
-
下面所有列举的重定向格式中的 word 除特意指明以外,都是指各种扩展之后的效果,本文只针对重定向,这些扩展具体可以查看bash的参考手册,在这里我们就使用不带任何扩展、最简单的文件名来说明。
重定向就是针对文件描述符的操作,理解到这一点,重定向也就不难了。
二、输入重定向(Redirecting Input)
格式:[n]<word
说明:将文件描述符n重定向到word指代的文件(以读的方式打开),如果n省略(第3个注意项),则是将标准输入重定向。
举例:
$ cat < file # 等价于cat 0<file
子进程的shell在继承3个文件描述符以后,解析到重定向符号‘<',然后将标准输入重定向到file,之后执行cat指令,cat指令从标准输入读取数据,标准输入由于已定向到file,所以就转而从file中读取输入内容。