有些时候你想要保存某个命令的输出而不仅仅只是让它显示在显示器上。bash shell提供了几
个操作符,可以将命令的输出重定向到另一个位置(比如文件)。重定向可以用于输入,也可以
用于输出,可以将文件重定向到命令输入。本节介绍了如何在shell脚本中使用重定向。
11.5.1 输出重定向
最基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:
command > outputfile
之前显示器上出现的命令输出会被保存到指定的输出文件中。
$ date > test6
$ ls -l test6
-rw-r—r— 1 user user 29 Feb 10 17:56 test6
$ cat test6
Thu Feb 10 17:56:58 EDT 2014
$
重定向操作符创建了一个文件test6(通过默认的umask设置),并将date命令的输出重定向
到该文件中。如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。
$ who > test6
$ cat test6
user pts/0 Feb 10 17:55
$
现在test6文件的内容就是who命令的输出。
有时,你可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,比如你正
在创建一个记录系统上某个操作的日志文件。在这种情况下,可以用双大于号(>>)来追加数据。
$ date >> test6
$ cat test6
user pts/0 Feb 10 17:55
Thu Feb 10 18:02:14 EDT 2014
$
test6文件仍然包含早些时候who命令的数据,现在又加上了来自date命令的输出。
11.5.2 输入重定向
输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的
输出重定向到文件。
输入重定向符号是小于号(<):
command < inputfile
一个简单的记忆方法就是:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动
的方向。小于号说明数据正在从输入文件流向命令。
这里有个和wc命令一起使用输入重定向的例子。
$ wc < test6
2 11 60
$
wc命令可以对对数据中的文本进行计数。默认情况下,它会输出3个值:
文本的行数
文本的词数
文本的字节数
通过将文本文件重定向到wc命令,你立刻就可以得到文件中的行、词和字节的计数。这个例
子说明test6文件有2行、11个单词以及60字节。
还有另外一种输入重定向的方法,称为内联输入重定向(inline input redirection)。这种方法
无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。乍看一眼,
这可能有点奇怪,但有些应用会用到这种方式(参见11.7节)。
内联输入重定向符号是远小于号(<<)。除了这个符号,你必须指定一个文本标记来划分输
入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
command << marker
data
marker
在命令行上使用内联输入重定向时,shell会用PS2环境变量中定义的次提示符(参见第6章)
来提示输入数据。下面是它的使用情况。
$ wc << EOF
> test string 1
> test string 2
> test string 3
> EOF
3 9 42
$
次提示符会持续提示,以获取更多的输入数据,直到你输入了作为文本标记的那个字符串。
wc命令会对内联输入重定向提供的数据进行行、词和字节计数。