基本输入输出三个:
0 标准输入STDIN
1 标准输出STDOUT
2 标准错误STDERR
标准错误流默认是输出到屏幕即标准输出上的。
重定向:
符号 > 输出覆盖 >>输出追加 <输入
ls -al > list 将结果写入list文件中,list没有将创建
ls -al >> list 将结果追加到list尾部,list没有将创建
上面这种情况只能一次性的改变输入输出方向,要想在终端或shell中永久(也不能算是永久,在退出之前所有的输入输出是有效的)有效,需要用到exec命令,可以用man exec 查看bash中的帮助(需要查找 /exec 最好跟空格)
exec 1> list 表示将标准输出重定向到list文件中,以后的输出都会到list中,这个是追加的,后面输出的内容不会覆盖以前的,我刚试了。
如果你这样做了,你就会发现你没办法将输出从list返回到标准输出中了,要改变这种情况,需要用一个中间值将标准输出保存起来,书中叫Open File descriptor ,描述符最多只能有9个,可以用lsof命令列出所有的,也可用
lsof -a -p $$ -d 0,1,2 列出描述符为0,1,2的情况,$$表示当前bash,-a表示and,具体请man
示例:
exec 3>&1(描述符3重定向到标准输出,3后面不能有空格)
exec 1>list(标准输出重定向到list)
ls (输出到了list中)
exec 1>&3(将标准输出重定向会monitor)
ls(输出到屏幕上)
我感觉描述符中存的是一个地址,在你修改1的时候,3指向的地址不会变,仍然是标准输出,所以才可以重定向回来(自我感觉)。
要想弃置一个描述符可以使用&-, exec 3>&-,再应用的时候会报错3: Bad file descriptor
抑制输出:
有时候不想看到一些错误信息,可以将错误输出重定向到 /dev/null ,有时候想将一个文件清空,可以用 file</dev/null ,这样文件保留,但是内容已经没了,wiki中有比较有意思的解释 http://zh.wikipedia.org/wiki//dev/null,有兴趣的可以看看。
生成日志:
有时候既想在控制台上看到,又想将信息存到一个file中,该怎么办呢?这时候就可以使用一个特别的命令tee,可以将信息输出到这两个地方,man一下解释: tee - read from standard input and write to standard output and files