65、shell,输入输出重定向
1、重定向相关文件描述符
1)文件描述符
① 0 标准输入,/dev/stdin -> /proc/self/fd/0
② 1 标准输出,/dev/stdout -> /proc/self/fd/1
③ 2 标准错误输出,/dev/stderr -> /proc/self/fd/2
2)重定向
① > 是1>的简写
② < 是0<的简写
③ > 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口中。
④ >> 将命令输出添加到文件末尾而不删除文件中的信息。
⑤ >& 将一个句柄的输出写入到另一个句柄的输入中。
2>&1声明文件描述符2为文件描述符1的副本(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流)。
3)其它
① >>file 将 STDOUT字符串追加到文件内容之后
② >file将 STDOUT重定向到新文件,当设定 $noclobber 时,可重写文件
③ >&file将STDOUT及STDERR(/dev/stdout)重定向到文件(command >& file)
④ >>&将 STDOUT及STDERR(/dev/stderr) 字符串追加到文件内容之后(command >>& file)
⑤ [n]>&-关闭 STDOUT或文件描述符n(command >&-)
2、注意
1)shell遇到”>”操作符,会判断右边文件是否存在,如存在就先删除,且创建新文件;不存在直接创建。无论左边命令执行是否成功,右边文件都会变为空。
2)“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出或错误输出绑定。
3)当命令执行完,绑定文件的描述符也自动失效,0,1,2又会空闲。
4)命令在执行前,先会检查输出是否正确,如输出设备错误,将不会执行命令。
5)IO重定向中,stdout与stderr的管道会先准备好,才从stdin 读数据
6)tee 在不影响原I/O 的情况下,将stdout 复制一份到档案去
7)bash执行命令过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令
8)( )将command group置于sub-shell执行,也称nested sub-shell,有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。
3、示例
1)cat>catfile <test.sh #cat从test.sh获得输入数据,然后输出给文件catfile
2)cat > catfile #从标准键盘获得数据,输出到catfile
3)cat>catfile <<eof #这里,"<<",代表"结束的输入字符"。当空行输入eof字符,输入自动结束,不用ctrl+D
4)cat <>file 以读写的方式打开 file;
5)cmd << delimiter >file,从stdin 中读入,直至遇到 delimiter 分界符
4、exec
1)exec命令:常用来替代当前shell 并重新启动一个shell,也就是说,并没有启动子shell。使用这一命令时任何现有环境都将会被清除。exec在对文件描述符进行操作的时候,不会覆盖当前的shell环境。
2)命令格式
exec 文件描述符[n] <或> file或文件描述符或设备
3)在上面所述的输入,输出重定向,将输入,输出绑定文件或设备后,只对当前那条指令是有效的,如果需要在绑定之后,接下来的所有命令都支持的话,就需要用exec命令。
5、exec示例
1)exec 6>&1 #将标准输出与fd 6绑定
ls /proc/self/fd/
2)exec 1>&6 #恢复标准输出
3)exec 6>&- #关闭fd 6描述符
参考
【1】 man手册
【2】 总结不错
http://hi.baidu.com/xxjyz/blog/item/59bbbb0394856d1c4bfb51ee.html
http://blog.163.com/zhoumhan_0351/blog/static/39954227201061045630711/
【3】 好文
http://www.360doc.com/content/11/0720/15/379588_134716249.shtml
【4】 讲解也比较清晰
http://www.xxlinux.com/linux/article/development/shell/2006-10-16/5018.html