一、文件代码
“转向”的意思是说:原本应由标准输入(如键盘)读取数据的,改由其它文件读取;原本应把结果显示在标准输出(如屏幕)的,改输出到其它文件。在这个过程中会涉及到文件代码(file descriptor)的概念。
所谓文件代码,是指操作系统赋予已开启文件一个编号(由0开始),作为追踪文件之用,如对这个文件进行读取或写入的操作,都使用文件代码来沟通。下边文件代码数字用fd来表示。
操作系统默认3个文件代码:0 标准输入、1 标准输出、2 标准错误
这3个文件在建立Shell环境时已开启,往后如果开启新文件,则分配2以上的号码。
< 代表转向输入,如果< 左边省略文件代码,则默认为0,指的就是标准输入。
> 代表转向输出,如果> 左边省略文件代码,则默认为1,指的就是标准输出。
这些转向语法大部分不能单独使用,必须跟Bash的命令一起运用,如exec、ls、read等,是属于指令结构的一部分。
本篇中的fd、n、m代表文件代码
#echo ’hello,world!‘ > a.txt #exec 7<>a.txt #cat <&7 hello,world!
二、操作文件
这里要说明的"操作文件",是指运用转向的概念,开启文件、复制文件代码和关闭文件。
1、开启文件
语法:fd<>文件
用途:开启文件,指定代码为fd。使用这种方式开启的文件,可供读写。
用例:exec 6<>test.txt
使用exec执行转向,开启文件test.txt,并指定其代码文件为6
2、关闭文件
开启文件后,如果该文件不再使用,最好关闭文件,交回调用文件代码所占用的系统资源。这是一个很好的习惯。
关闭转向输入文件
语法:fd<&-
用例:6<&-
关闭转向输出文件
语法:fd>&-
用例:exec 5>&-
3、复制文件代码,建立文件链接
操作系统已开启的文件代码(0、1、2),为了不影响原有文件代码的作用,最好先复制一份,等操作结束再还原回去,称“复制代码”。
两种方式:
a、复制转向输入的文件代码m,存文件代码n,使n连接至m n<&m
b、复制转向输出的文件代码m,存成文件代码n,使n连接至m n>&m
用例:
exec >&6 等同于exec 1>&6,将标准输出连接到文件代码6,因此,凡是出现在标准输出的内容,会转存至文件代码6
cat <&6 等同于cat 0<&6,将文件代码6的内容,转向至标准输入,而由cat把内容显示出来。
exec 5<&0 复制标准输入(0),存成文件代码5,即建立文件代码0的连接,简单说就是做标准输入的备份。
exec 0<&5 5<&- 将存储在文件代码5的标准输入还原,并关闭文件代码5。
三、转向的用法
代码要紧邻符号,转向输入输出默认只能使用一次。
1、转向输入
语法:fd<文件
用途:使用"文件"作为输入,指定它的文件代码为fd
用例:
wc -l < /etc/passwd #<左方省略fd,默认fd为0,指的就是标准输入转向:
exec 6< /etc/passwd #<左方文件代码不空;
wc -l <&6 #当一次输入回车的时候,会输出passwd行数,再按一次回车则为空
2、转向输出
语法:fd>文件
用途:使用文件做输出,指定文件代码为fd
如果文件不存在,会建立,如果存在,会清空。可以关闭文件默认操作set -o noclobber或set -C
用例:
>test.txt(创建空文件) #>左方的省略fd,fd默认为1
:>test.txt #效果同上
ls > dirs.txt #存储命令执行的输出
exec 6> out.txt #开启文件out.txt作为输出
echo 'hello world!' 1>&6 #将echo输出的内容存储在文件代码6
fd>|文件 同fd>文件 但fd>|不理会noclobber选项,会强制覆盖、清空。
>|不管noclobber选项是否启用,只要文件存在,该内容一定会被清空。
3、转向附加
语法:fd>>文件
用途:使用方法同 fd>文件, 只是fd>>不会覆盖、不会清空,只是追加。
4、标准错误伴随标准输出做转向
语法:&>文件 或 >&文件 效果一样。
'>文件 2>&1'和 &>作用一样。
转载于:https://blog.51cto.com/linuxnote/1641252