天天看点

linux shell脚本编程笔记(五): 重定向

<a></a>

默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), and stderr (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重定向. 对于重定向简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者甚至是脚本中的代码块的输出, 然后将这些输出作为输入发送到另一个文件, 命令, 程序, 或脚本中.

每个打开的文件都会被分配一个文件描述符.stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3到9. 在某些时候将这些格外的文件描述符分配给stdin, stdout, 或者是stderr作为临时的副本链接是非常有用的. 在经过复杂的重定向和刷新之后需要把它们恢复成正常的样子.

 将输入输出重定向与管道相结合

将多个输出流重定向到一个文件上:

关闭文件描述符

子进程继承了打开的文件描述符. 这就是为什么管道可以工作. 如果想阻止fd被继承, 那么可以关掉它:

exec 命令会将stdin重定向到文件中. 从这句开始, 后边的输入就都来自于这个文件了, 而不是标准输入了(通常都是键盘输入). 这样就提供了一种按行读取文件的方法, 并且可以使用sed 和/或 awk来对每一行进行分析.

使用exec重定向标准输入:

例如可以这样读文件:

当然一般我们可以直接重定向文件到一个代码块,相当于重定向到这个代码块的标准输入。

通常我们可以将利用将代码块的输入输出重定向的方法实现一些对于文件的操作。

例如:

here documents是一段代码块,可以利用重定向将这个代码块传递到一个交互或者命令中。

标准的结构为:

例如:

输出为:

也可以用<code>&lt;&lt;-</code>来排除tab对heredocuments的影响

输出会是

此外,here document可以使用参数替换

将会输出

参数替换可以使用''来禁用

可以利用这种方法来产生代码,不会造成问题。

函数也可以使用here document来提供数据

也可以输出

还可以使用here document注释代码块

相当于将here document传递给了:,不会有任何的影响。

注意here document的结束符前后都不可以有空格,否则会产生识别上的错误

here string可以认为是here document的一种形式。

将会输出:

相当于直接将一个string传递给了命令.

上面这两个例子都会清空文件file。原因同一个:在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 取资料。故而上面的两个例子都会先执行"&gt; file"操作,即清空了文件,再执行前面的操作。这个陷阱需要额外注意。

本文转自 jiu~ 博客园博客,原文链接:http://www.cnblogs.com/jiu0821/p/8296596.html,如需转载请自行联系原作者

继续阅读