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将STDOUTSTDERR(/dev/stdout)重定向到文件(command >& file

>>&将 STDOUTSTDERR(/dev/stderr) 字符串追加到文件内容之后(command >>& file

[n]>&-关闭 STDOUT或文件描述符ncommand >&-

2、注意

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

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

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

4)命令在执行前,先会检查输出是否正确,如输出设备错误,将不会执行命令。

5)IO重定向中,stdoutstderr的管道会先准备好,才从stdin 读数据

6)tee 在不影响原I/O 的情况下,将stdout 复制一份到档案去

7)bash执行命令过程:分析命令-变量求值-命令替代(``$( ))-重定向-通配符展开-确定路径-执行命令

8)( )command group置于sub-shell执行,也称nested sub-shell,有一点非常重要的特性是:继承父shellStandard input, output, and error plus any other open file descriptors

3、示例

1)cat>catfile <test.sh  #cattest.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描述符

参考

1man手册

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

你可能感兴趣的:(shell)