Linux 操作系统有一个叫做输入输出流的概念。三个默认的输入/输出流是标准输入、标准输出和标准误差。当一个进程启动时,它连接到这三个输入/输出流,也称为标准流。默认情况下,标准输入来自键盘,而标准输出和标准错误显示在屏幕上。按照惯例,标准输出用于正常输出,而标准错误则保留用于错误消息。
每个流被分配一个文件描述符。文件描述符由一个数字引用,代表一个打开的文件。标准输入被分配文件描述符0
,标准输出被分配文件描述符1
,标准错误被分配文件描述符2
。这实际上意味着您的键盘和显示器被视为文件。事实上,你的键盘和显示器可以代替实际的文件。这一抽象层允许您将通常出现在屏幕上的输出保存到文件中。它还允许您从文件向命令发送输入。您甚至可以将一个命令的输出用作另一个命令的输入。
表 34:标准流
文件描述符 | 缩写 | 溪流 |
---|---|---|
Zero | 标准输入 | 标准输入 |
one | stdout | 标准输出 |
Two | stderr | 标准误差 |
许多 Linux 命令允许您通过指定一个文件作为参数或接受标准输入来提供输入。在没有文件的情况下,许多命令需要标准输入。文件和标准输入都以文件结束标记结束。您可以通过键盘输入Ctrl-d
来产生这个电渗流标记。
作为这种行为的一个例子,我们来看看sort
命令。要让sort
对文件进行操作,请提供该文件作为参数,如下例所示。
$ cat test.txt
e
a
c
b
d
$ sort test.txt
a
b
c
d
e
$
要让sort
在标准输入下操作,运行sort
命令,不需要任何参数,并开始输入文本。完成后,输入Ctrl-d
发送 EOF 字符。然后将对您提供的标准输入进行排序。
$ sort
e
a
c
b
d
<Ctrl-d>
a
b
c
d
e
$
要将一个命令的标准输出作为另一个命令的标准输入,请在命令之间使用管道符号(|
)。以下示例演示了将cat text.txt
的输出作为输入发送到sort
命令。
$ cat test.txt | sort
a
b
c
d
e
$
要将文件内容用作标准输入,请用小于号(<
)将命令与文件分开。
$ sort < test.txt
a
b
c
d
e
$
要将命令输出重定向到文件,请使用大于号(>
)后跟文件名。如果文件不存在,它将被创建。如果它确实存在,它将被覆盖。
$ sort test.txt > sorted.txt
$ cat sorted.txt
a
b
c
d
e
$
如果要向文件追加输出,请使用双大于号(>>
)。如果文件不存在,它将被创建,但是如果它存在,命令的输出将被附加到文件中。
$ sort test.txt >> sorted.txt
$ cat sorted.txt
a
b
c
d
e
a
b
c
d
e
$
您不仅限于重定向输入或重定向输出,您可以同时执行这两项操作。以下示例演示了从test.txt
读取标准输入,同时将标准输出重定向到sorted.txt
。
$ sort < test.txt > sorted.txt
$ cat sorted.txt
a
b
c
d
e
$
表 35:重定向输入/输出
| 操作员 | 格式 | 行动 |
| >
| cmd > file
| 使用来自cmd
的标准输出创建或覆盖file
。 |
| >>
| cmd >> file
| 使用来自cmd
的标准输出创建或附加到file
。 |
| <
| cmd < file
| 将file
的内容作为cmd
的标准输入。 |
默认情况下,输入重定向在文件描述符 0 上运行,输出重定向在文件描述符 1 上运行。通过在操作符前面加上文件描述符编号,可以显式声明一个用于重定向的文件描述符。不要在文件描述符号和重定向操作符之间使用空格。如果文件描述符没有紧接在重定向操作符之前,它将被解释为命令行上的另一项。
要在向屏幕显示标准输出时将错误信息捕获到文件中,请使用2> file
。您也可以将标准输出重定向到一个文件,同时将标准输出重定向到另一个文件。
$ ls test.txt no-such-file
ls: cannot access no-such-file: No such file or directory
test.txt
$ ls test.txt no-such-file 2>errors
test.txt
$ cat errors
ls: cannot access no-such-file: No such file or directory
$ ls test.txt no-such-file 1>normal-output 2>errors
$ cat normal-output
test.txt
$ cat errors
ls: cannot access no-such-file: No such file or directory
$
您不仅可以将输出重定向到一个文件,还可以使用&符号后跟文件描述符号将其重定向到另一个文件描述符。使用这种方法,可以使用2>&1
将标准输出和标准误差结合起来。不要使用空格。
以下命令是指“将ls
命令的标准输出发送到combined-output
文件,并将标准误差追加到标准输出中。”所有输出将被发送到combined-output
文件,因为标准误差被重定向到标准输出,而标准输出被重定向到combined-output
。
$ ls test.txt no-such-file > combined-output 2>&1
$ cat combined-output
ls: cannot access no-such-file: No such file or directory
test.txt
$
如果您不想将命令输出显示到屏幕上或保存到文件中,您可以将输出重定向到空设备/dev/null
。这个特殊文件只是丢弃发送给它的任何输入。空设备有时被称为“黑洞”或“比特桶”。以下示例将错误从sort
重定向到空设备。
$ ls test.txt no-such-file
ls: cannot access no-such-file: No such file or directory
test.txt
$ ls test.txt no-such-file 2>/dev/null
test.txt
$