前言
I/O重定向允许我们将命令的输入和输出重定向到文件中,以及将多个命令连接到一起成为管道。本文就来介绍有关重定向的知识。
标准输入、输出、错误
输出包括两种类型:
- 程序的结果。被称为标准输出或者
stdout
。 - 状态以及错误信息。被称为标准错误或者
stderr
。
除此之外,一些程序从标准输入stdin
中获取输入。默认情况下,标准输入与键盘相连接。
默认情况下,stdout
和stderr
都被链接到屏幕上,而不是保存到文件中。重定向允许我们改变输出的去向和输入的来源。
重定向标准输出
为了重定向到其他文件而不是屏幕上,我们使用>
重定向操作符,后面跟随文件的名称。
举例来说,我们可以使用重定向操作符来告诉shell
,发送ls
命令的输出到ls-output.txt
文件中,而不是屏幕上。
ls -l /usr/bin > ls-output.txt
我们可以看到,ls
命令的输出没有发送到屏幕上,而是发送ls-output.txt
到文件中。
需要注意的是,使用>
重定向操作符会覆盖目标文件。如果要追加内容,我们可以使用>>
重定向操作符。
重定向标准错误
为了重定向stderr
,我们必须引用其文件描述符。shell
将stdout
、stdin
和stderr
分别作为文件描述符0、1和2的内部引用。我们可以用这个符号重定向stderr
。
ls -l /bin/usr 2> ls-error.txt
重定向到同一文件
重定向标准输出和标准错误到同一文件中,共有两种方式可以实现。首先让我们使用传统方法,它适用于老版本的shell
:
ls -l /bin/usr > ls-output.txt 2>&1
首先,我们将stdout
重定向到ls-output.txt
文件,然后用2>&1
的符号将文件描述符2 stderr
重定向到文件描述符1 stdout
中。
需要注意重定向的顺序,重定向stderr
必须总是在重定向stdout
之后发生。
最近版本的bash
提供了第二种方法,该方法让执行这种组合重定向更精简。
ls -l /bin/usr &> ls-output.txt
你仍然可以使用>>
进行追加操作。
处理不需要的输出
系统提供了一种方法,可以将输出重定向到一个叫做/dev/null
的特殊文件,该文件通常被称为比特桶(bit bucket)。它接受输入,但不做任何处理。
ls -l /bin/usr 2> /dev/null
重定向标准输入
还有<
重定向操作符,我们可以将stdin
的来源从键盘改为文件。
cat < sample.txt
管道
使用管道操作符|
,一个命令的stout
可以通过管道进入另一个命令的stdin
,less
就是一个例子:
ls -l /usr/bin | less
可以把几个命令放在一起,组成一个流水线。使用这种方式的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。
tee命令
tee
命令读取stdin
并将其复制到stdout
和一个或多个文件中。
ls /usr/bin | tee ls.txt | grep zip