如何在 Linux 进行重定向输出

Posted on Wed, 25 Dec 2024 13:56:02 +0800 by LiangMingJian


需求

有时候用户需要将 Linux 命令的执行结果保存到文件,或将执行结果直接丢弃,此时就需要使用重定向功能,将命令输出到某个指定文件或空文件中。

通过 > 与 » 进行重定向

在 Linux 中,> 和 » 是用来重定向标准输出的符号,其中:

  • > 在输出时会强制覆盖原内容
  • >> 在输出时会使用追加模式
ping baidu.com > A.txt
ping baidu.com >> A.txt

重定向到空文件

空文件 /dev/null

在 Linux 中,空文件 /dev/null 是类似于 Windows 中垃圾箱的空设备设备,无论用户向空文件写入什么数据,空文件都只会输出 null。

类似的文件还有文件 /dev/zero,这个文件只会输出 0。

重定向到空文件

在 Linux 中,一切皆是文件。因此,标准输入 stdin,标准输出 stdout、标准错误 stderr 都可以作为文件看待,这三个系统文件的文件描述符分别为 0,1,2。

为实现重定向到空文件,显然,用户需要将标准输出 1,标准错误 2 写入到空文件 /dev/null 中,因此可以简单的得出下面的代码:

ping baidu.com 1>/dev/null 2>/dev/null

注意到,上面的写法其实有问题的

不难看出,因为标准输出和标准错误都需要分别写入同一个文件中,因此标准输出和标准错误都需要创建一个管道连接这同一个文件,这就导致了目标文件会被竞争使用,标准输出和标准错误会相互覆盖。

为解决这个问题,我们可以将标准错误的内容重定向到标准输出,让标准错误通过标准输出来写入空文件中,在整个过程中只使用标准输出与目标文件一个管道。

ping baidu.com 1>/dev/null 2>&1

上面便是输出到空文件的标准写法(当然不输出空文件也可以使用这个写法)。

  • 1>/dev/null: 标准输出重定向到空设备,即不输出任何信息到终端
  • 2>&1:标准错误重定向到标准输出,& 用于表示等同于的意思,表示标准错误 2 的输出等同于标准输出 1

特别提醒,2>&1 必须写在 1>/dev/null 后面,这是因为:

只有先重定向好标准输出的内容,标准错误才能正确拷贝标准输出的重定向内容进行输出,实现将标准输出和错误都重定向到一个文件的功能。

当先写 2>&1 时,因为命令的执行顺序,所以标准错误会先拷贝标准输出的内容,但此时标准输出还是在终端,因此标准错误会被重定向终端,而标准输出在后面重定向命令执行时会正确重定向到文件。