Skip to content

Files

Latest commit

a5b4287 · Jan 9, 2022

History

History
179 lines (140 loc) · 5.74 KB

10.md

File metadata and controls

179 lines (140 loc) · 5.74 KB

十、输入输出重定向

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
    $