> /dev/null 2>&1 || 是什么意思 在 Linux 中真正的意思是什么?

Aso*_*o'K 5 stdout

"command "> /dev/null 2>&1 || true  
Run Code Online (Sandbox Code Playgroud)

现在我知道我们正在将我们运行的命令的输出发送到一个空文件。我需要知道具体含义*2>&1 || true*

use*_*ser 13

TL;DR: >/dev/null 2>&1 || true有效地使命令静音,丢弃任何(错误或正常)输出和命令的结果,但不会丢弃其任何副作用。下面是对原因的解释。


Linux 程序默认接收三个文件描述符,它们在程序的主代码开始执行之前打开。它们是stdin(标准输入,文件描述符 0),stdout(标准输出,文件描述符 1)和stderr(标准错误,文件描述符 2)。这些通常与当前终端相关联,今天实际上分别表示键盘、屏幕和屏幕(但情况并非总是如此)。

通过> /dev/null在命令中指定(重定向通常可以在命令内的任何地方进行,但按照惯例,它在末尾或很少在开头),您指定标准输出(隐式1,但可以使用1>而不是仅指定>)应该重定向到 write to /dev/null,这会丢弃写入其中的所有内容。

2>&1然后将文件描述符 2 ( 2>)重定向到当前绑定到的文件描述符 1 ( &1)。

当你想重定向既快捷stdout,并stderr以相同的地方是使用&>作为&> /dev/null。但是,并非所有 shell 都支持此功能。

因此,通过指定> /dev/null 2>&1您告诉系统您要将命令的标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出(然后重定向到 /dev/null)。这具有通过丢弃发送到 stdout 或 stderr 的所有输出来使命令静音的效果。

请注意,某些程序使用其他方式绘制到屏幕上,例如像 ncurses 这样的终端库,并且通常不会受此影响或会以意想不到的方式受到影响。但是对于以管道方式编写的程序(包括大多数向终端输出简单文本的程序),这是有效的。

||反过来意味着,如果程序返回的退出状态不是 0(按照约定,0 表示成功执行),那么 shell 将调用 的另一侧的命令||,在这种情况下是true。不要将此与普通管道混淆,后者使用单个管道|并将左侧标准输出与右侧标准输入联系起来。与之相反的||is&&仅在左侧返回退出状态为 0 时才执行右侧,而互补的 is;只是将多个命令分开(无论第一个命令的退出状态如何,都会执行第二个命令)。

true反过来,它是一个非常简单的程序,其唯一目的是以成功状态退出。它本身通常不是很有用,但在例如在 shell 脚本中编写条件时可能非常有用。它的反面是以false失败(非零)状态退出,但除此之外,就像 true 一样,什么都不做。

因此,通过|| true在命令后附加,您知道无论哪种方式,在该组命令完成执行时,某些内容都会成功执行。因此,您知道当前状态代码(在 中可用$?)将始终表示成功执行。