Linux Shell之八 转向的用法

一、文件代码

    “转向”的意思是说:原本应由标准输入(如键盘)读取数据的,改由其它文件读取;原本应把结果显示在标准输出(如屏幕)的,改输出到其它文件。在这个过程中会涉及到文件代码(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‘和 &>作用一样。


本文出自 “Welcome To Linux World” 博客,请务必保留此出处http://linuxnote.blog.51cto.com/9876511/1641252

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。