"command "> /dev/null 2>&1 || true
现在我知道我们正在将运行的命令的输出发送到一个空文件。我需要知道*2>&1 || true*
答案1
总结: >/dev/null 2>&1 || true
有效地使命令静音,丢弃任何(错误或正常)输出和命令结果,但不会丢弃其任何副作用。下面解释了原因。
Linux 程序默认接收三个文件描述符,这些文件描述符在程序的主代码开始执行之前打开。它们是stdin
(标准输入,文件描述符 0)、stdout
(标准输出,文件描述符 1)和stderr
(标准错误,文件描述符 2)。它们通常与当前终端相关联,如今实际上分别意味着键盘、屏幕和屏幕(但情况并非总是如此)。
通过在命令中指定> /dev/null
(重定向通常可以在命令中的任何位置进行,但按照惯例,它位于末尾或很少位于开头),您可以指定标准输出(隐式的1
,但可以使用1>
而不是仅 来指定>
)应重定向到 写入/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
。不要将其与普通管道混淆,普通管道使用单个命令|
并将左侧标准输出与右侧标准输入绑定在一起。 的对立面||
是&&
,只有当左侧返回退出状态 0 时才执行右侧,而互补的 is;
只是将多个命令分隔开(无论第一个命令的退出状态如何,都会执行第二个命令)。
true
反过来,是一个非常简单的程序,其唯一目的是以成功状态退出。它本身通常不是很有用,但在编写 shell 脚本中的条件时非常有用。它的对立面是,以失败false
(非零)状态退出,但除此之外,像 true 一样,什么也不做。
|| true
因此,通过在命令后附加,您知道无论哪种方式,某物在该组命令执行完毕时,将成功执行。因此,您知道当前状态代码(在 中可用$?
)将始终指示执行成功。
答案2
Linux 中的“command ” > /dev/null 2>&1 || true 是什么意思?
2>&1
表示“将STDERR
(2)重定向到STDOUT
(1)”
(STDERR
(标准错误)的预定义文件描述符等于 2
并且STDOUT
(标准输出)的文件描述符等于 1)
>
- 和 相同1>
,表示重定向STDOUT
到某个地方
那么整个操作将被翻译为:
command > /dev/null 2>&1
- 将 STDOUT 和 STDERR 文件描述符重定向到“黑洞”或基本上忽略所有输出command
(“黑洞”或/dev/null
接受输入并在内部忽略它的特殊设备)
关于|| true
- 如果command
返回非 0(零)退出状态(通常表示某种类型的错误/失败)则true
强制将退出状态代码设置为 0(零)表示成功。