linuxshell数据重定向(输入重定向与输出重定向)详尽剖析linuxshell数据重定向(输入重定向与输出重定向)详尽剖析在了解重定向之前,我们先来瞧瞧linux的文件描述符。linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时侯的句柄linux 进程输出重定向,通过句柄就可以实现文件的读写操作。用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit–n定义数字有关系,不能超过最大值。linux启动后,会默认打开3个文件描述符,分别是:标准输入standardinput0,正确输出standardoutput1,错误输出:erroroutput2之后打开文件后。新增文件绑定描述符可以依次降低。一条shell命令执行linux 进程输出重定向,就会承继父进程的文件描述符。为此,所有运行的shell命令linux系统编程,就会有默认3个文件描述符。对于任何一条linux命令执行,它会是这样一个过程:一个命令执行了:先有一个输入:输入可以从按键,也可以从文件得到命令执行完成:成功了,会把成功结果输出到屏幕:standardoutput默认是屏幕命令执行有错误:会把错误也输出到屏幕里面:standarderror默认也是指的屏幕文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。
这种数字值就是文件描述符。最为人们所知的文件米描述符是stdin,stdout和stderr,文件描述符的数字分别是0,1和2。这种数字和各自的设备是保留的。一个命令执行前,先会打算好所有输入输出,默认分别绑定(stdin,stdout,stderr),假如这个时侯出现错误,命令将中止,不会执行。命令解析过程,可以参考:LinuxShell键值、元字符、转义符使用实例介绍这种默认的输出红旗linux系统下载,输入都是linux系统内定的,我们在使用过程中,有时侯并不希望执行结果输出到屏幕。我想输出到文件或其它设备。这个时侯我们就须要进行输出重定向了。linuxshell下常用输入输出操作符是:1.标准输入(stdin):代码为0,使用或>>;/dev/stdout->/proc/self/fd/11代表:/dev/stdout3.标准错误输出(stderr):代码为2,使用2>或2>>;/dev/stderr->/proc/self/fd/22代表:/dev/stderr,输出重定向:格式:command-line1[1-n]>file或文件操作符或设备里面命令意思是:将一条命令执行结果(标准输出,或则错误输出,原本都要复印到屏幕里面的)重定向其它输出设备(文件,打开文件操作符,或复印机等等)1,2分别是标准输出,错误输出。
实例:#显示当前目录文件test.shtest1.shtest1.sh实际不存在[chengmo@centos5shell]$lstest.shtest1.shls:test1.sh:没有这个文件和目录test.sh#正确输出与错误输出都显示在屏幕了,如今须要把正确输出写入suc.txt#1>可以省略,不写,默认所至标准输出[chengmo@centos5shell]$lstest.shtest1.sh1>suc.txtls:test1.sh:没有这个文件和目录[chengmo@centos5shell]$catsuc.txttest.sh#把错误输出,不输出到屏幕,输出到err.txt[chengmo@centos5shell]$lstest.shtest1.sh1>suc.txt2>err.txt[chengmo@centos5shell]$catsuc.txterr.txttest.shls:test1.sh:没有这个文件和目录#继续追加把输出写入suc.txterr.txt“>>”追加操作符[chengmo@centos5shell]$lstest.shtest1.sh1>>suc.txt2>>err.txt#将错误输出信息关掉掉[chengmo@centos5shell]$lstest.shtest1.sh2>&-test.sh[chengmo@centos5shell]$lstest.shtest1.sh2>/dev/nulltest.sh#&[n]代表是早已存在的文件描述符,&1代表输出&2代表错误输出&-代表关掉与它绑定的描述符#/dev/null这个设备,是linux中黑洞设备,哪些信息只要输出给这个设备,就会给吞掉#关掉所有输出[chengmo@centos5shell]$lstest.shtest1.sh1>&-2>&-#关掉1,2文件描述符[chengmo@centos5shell]$lstest.shtest1.sh2>/dev/null1>/dev/null#将1,2输出转发给/dev/null设备[chengmo@centos5shell]$lstest.shtest1.sh>/dev/null2>&1#将错误输出2绑定给正确输出1,之后将正确输出发送给/dev/null设备这些常用[chengmo@centos5shell]$lstest.shtest1.sh&>/dev/null#&代表标准输出,错误输出将所有标准输出与错误输出输入到/dev/null文件注意:1、shell遇见”>”操作符,会判定一侧文件是否存在,假如存在就先删掉,而且创建新文件。
不存在直接创建。无论右侧命令执行是否成功。右侧文件就会变为空。2、“>>”操作符,判定右侧文件,假如不存在,先创建。以添加方法打开文件,会分配一个文件描述符[不非常指定,默认为1,2]之后,与右边的标准输出(1)或错误输出(2)绑定。3、当命令:执行完,绑定文件的描述符也手动失效。0,1,2又会空闲。4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。5、一条命令在执行前,先会检测输出是否正确,假如输出设备错误,将不会进行命令执行,输入重定向格式:command-line[n]catfiletestingcatfiletest#这儿按下[ctrl]+d离开#从标准输入【键盘】获得数据,之后输出给catfile文件[chengmo@centos5shell]$cat>catfilecatfile&1#将标准输出与fd6绑定[chengmo@centos5shell]$ls/proc/self/fd/01236#出现文件描述符6[chengmo@centos5shell]$exec1>suc.txt#将接出来所有命令标准输出,绑定到suc.txt文件(输出到该文件)[chengmo@centos5shell]$ls-al#执行命令,发觉哪些都不返回了,由于标准输出早已输出到suc.txt文件了[chengmo@centos5shell]$exec1>&6#恢复标准输出[chengmo@centos5shell]$exec6>&-#关掉fd6描述符[chengmo@centos5~]$ls/proc/self/fd/0123说明:使用前先将标准输入保存到文件描述符6,这儿说明下,文件描述符默认会打开0,1,2还可以使用自定义描述符。
之后对标准输出绑定到文件,接出来所有输出就会发生到文件。使用完后,恢复标准的输出,关掉打开文件描述符6。有趣事情:可能有同学会这样用:exec1>suc.txt,接出来所有输出都绑定到suc.txt文件,这么如何样恢复原先的呢,试试你才会发觉问题所在„„,复杂一点实例exec3test.sh;#打开test.sh可读写操作,与文件描述符3绑定whilereadline&-exec3