本篇博客用于介绍I/O重定向相关的符号和操作
I/O重定向符号:> < >> 2> 1> &1 &>
一.概念:
标准输入重定向:就是把命令的输入从默认的从键盘读取,重定向到一个文件: <file。
标准输出重定向:就是把命令的标准输出保存到指定的文件内:>file >>file 1>file。
标准错误输出重定向:把命令的错误输出保存到指定文件内:2>file 2>>file。
标准错误输出和标准输出均重定向到同一个文件的操作:
1>file 2>&1 或 &>file 或 &>>file (其中>和>>的区别就是一个覆盖文件原内容,一个不覆盖。并且注意,是没有2>>&1这种写法的。)
二.区分:
标准输出和标准错误输出不是包含关系,是两个独立的输出。标准输出是输出正常显示信息,标准错误输出是输出出错信息。
命令、shell脚本、判断(循环)语句块、shell函数等等,一切中间可以嵌套echo语句的或者本身就有输出的命令语句,都可以进行标准输入、标准输出、标准错误输出的I/O重定向。(可能这句话没有那么准确)
三.重定向过程:
系统会打开一个默认的文件,用于标准输入、标准输出、标准错误输出指向文件。
重定向后,系统会先关闭原指向文件,打开新文件,并把打开这个文件产生的指针重新装入进程文件表中。此时,文件描述符就更改了,更改为了指向新打开的这个文件的指针。所以,此时再用&1引用这个描述符,就是代表新打开的这个文件,而不是原系统默认文件。
需要注意的是:在重定向的时候,就已经对文件进行了操作。 如“>file”:在重定向后,file的内容就已经清空了,这在重定向这一步已经发生,而此时,命令行还没有执行。(命令解析过程:点击打开链接)
你也可以对比下面的例①。当重定向写法:>OriginalFile 1>TestFile时,虽然最后把标准输出定向到了TestFile。但是在定向到TestFile之前,是先定向到OriginalFile,然后又一次重定向到的TestFile。所以,OriginalFile的内容已经先一步被清空。
四.如何输出
提问:有没有办法,让输出信息既打印进文件,同时又输出到终端呢?
答案:有。
方法1:tee命令。
例如:bash test | tee filename
分析:bash test命令的输出结果,通过管道传递给tee命令。tee命令一边把标准输出打印进文件filename,一边就输出信息到屏幕。(注意的是,管道不能传递标准错误输出:点击打开链接)
方法2:/dev/tty
这种方法,如果重定向了脚本的标准输出和标准错误输出,通过>/dev/tty,可以将输出信息仍然能够送到用户的终端窗口,但是注意:输出到终端的这一句信息,不会再保存到文件内。
顺便讲一下命令:exec,这个命令有两种用法,我们今天只讲它重定向的功能。
exec命令加在脚本中,可以使这个脚本中其随后的、所有命令的标准输入、标准输出、标准错误输出重定向。
脚本例子test:
echo hello
exec >filename 2>errfilename #exec命令加在这里,只对下面的所有命令有效果
echo chenhaojie >/dev/tty #加了exec命令后,如果想输出中间的某一句,可以使用这种方式
echo WUST #由于exec的作用,打印到filename文件,而不是终端
执行:bash test
终端屏幕输出;hello
chenhaojie