重定向

Published: 26 Dec 2015 Category: Linux
理解重定向

###### 在了解重定向之前,我们先来看看linux 的文件描述符和命令执行过程

linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。

linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2;

以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。一个命令执行前,先会准备好所有输入输出,默认分别绑定(stdin,stdout,stderr)。

对于任何一条linux 命令执行,它会是这样一个过程:

先有一个输入:输入可以从键盘,也可以从文件得到
命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕, 命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕。


###### 现在来讲重定向

我们在执行命令时,有时候并不希望执行结果输出到屏幕,我想输出到文件或其它设备,这个时候我们就需要进行输出重定向了。

输出重定向

格式:

 command-line1 [1-n] > file或文件操作符或设备

上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的) 重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。 ***

实例:

#显示当前目录文件 test.sh test1.sh, test1.sh实际不存在
[chengmo@centos5 shell]$ ls test.sh test1.sh
ls: test1.sh: 没有这个文件和目录#输出错误信息
test.sh#正确输出信息

[chengmo@centos5 shell]$ ls test.sh test1.sh ** 1>suc.txt 2>err.txt **
[chengmo@centos5 shell]$ cat suc.txt err.txt
test.sh
ls: test1.sh: 没有这个文件和目录

#继续追加把输出写入suc.txt err.txt “»”追加操作符
[chengmo@centos5 shell]$ ls test.sh test1.sh 1»suc.txt 2»err.txt

[chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-
test.sh
[chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null
test.sh
** #&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符 #/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉 **

[chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1 #将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备 这种常用
*** 注意:

1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。

2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。

3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。

4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。

5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行   

输入重定向

格式:

command-line [n] <file或文件描述符&设备

命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。 *** 实例:

[chengmo@centos5 shell]$ cat>catfile <test.sh
#cat 从test.sh 获得输入数据,然后输出给文件catfile

About me

就读于中山大学, 记录日常的学习和生活.

Links