学习 Linux,101: 流、管道和重定向(5)

就像可以重定向 stdout 和 stderr 流一样,我们也可以使用 < 操作符从文件重定向 stdin。如果您已经学习了文章  “学习 Linux,101:文本流和过滤器 ” ,那么您可能还会记得我们在 sort 和 uniq 小节中使用 tr 命令将 text1 文件中的空格替换成制表符。在那个例子中我们使用来自 cat 命令的输出为 tr 命令创建标准输入。现在,我们没有必要调用 cat,而是使用输入重定向将空格转换成制表符,如清单 7 所示。


清单 7. 输入重定向
[ian@echidna lpi103-4]$ tr ' ' '\t'<text1 1 apple 2 pear 3 banana  

Shell(包括 bash)还有存在 here-document 的概念,它是另一种输入重定向形式。它将 << 和一个单词(比如 END)结合构成一个标记,用来表示输入端。我们在清单 8 中对此进行演示。


清单 8. 使用 here-document 的输入重定向
[ian@echidna lpi103-4]$ sort -k2 <<END > 1 apple > 2 pear > 3 banana > END 1 apple 3 banana 2 pear  

您可能很想知道可不可以仅输入 sort -k2 和数据,然后按 Ctrl-d 表明输入端。最简单的答案是,您可以这样做,但您必须先了解 here-documents。详细的答案是,here-documents 通常用于 shell 脚本(脚本没有其他方式能够表明应该将脚本的哪一行看作输入)。因为 shell 脚本通过广泛使用制表符来提供缩进,所以 here-documents 还有另一个特点。如果您使用 <<- 而不是 <<,那么将消除前面的制表符。

在清单 9 中,我们使用命令行替换创建了一个强制制表符,然后创建了一个包含两个 cat 命令的 shell 脚本,这两个命令都从 here-document 读取数据。注意,我们使用 END 作为从终端读取的 here-document 的标记。如果我们在该脚本中也使用 END 作为标记,将导致提前结束输入。因此我们使用 EOF 作为标记。在创建好脚本之后,我们使用点号 . 命令导入它,即在当前的 shell 上下文中运行它。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27839.html