当您可以通过将标准输出重定向到空文件来轻松实现相同的目的时,为什么许多命令提供选项-q
或抑制输出?--quiet
答案1
虽然您可以轻松地在 shell 中进行重定向,但在其他情况下却并不那么容易,例如在不使用 shell 命令行的情况下以另一种语言执行命令时。即使在外壳中:
find . -type f -exec grep -q foo {} \; -printf '%s\n'
打印所有包含
foo
.如果您重定向到/dev/null
,您将丢失两者find
和grep
输出。您需要诉诸-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;
(即生成一个额外的外壳)。grep -q foo
打字时间短于grep foo > /dev/null
- 重定向到
/dev/null
意味着输出仍然被写入然后被丢弃,这比不写入它的效率要低(并且不分配,准备要写入的输出) - 允许进一步优化。例如
grep
,由于 with-q
知道grep
不需要输出,因此一旦找到第一个匹配项,它就会退出。对于grep > /dev/null
,它仍然会尝试查找所有匹配项。 - 安静的并不一定意味着沉默的。对于某些命令来说,这意味着减少冗长(与 相反
-v|--verbose
)。例如,mplayer
有 a--quiet
和 a--really-quiet
。对于某些命令,您可以使用-qqq
来将详细程度降低 3 倍。
答案2
当它感觉需要在屏幕上添加注释时,它仍然允许输出该命令,但通常它不会输出任何内容。将所有内容重定向为 null 后,就没有机会看到输出。
答案3
虽然它可能取决于命令,但-q
也会禁用输出到stderr
.这使得 shell 不容易将 stderr 复制到 stdout (我正在看着你,csh
& tcsh
)以避免噪音。
有些程序提供“安静”选项,以应对可能有其他有意义的输出而您不希望与状态消息混杂在一起的情况。或等效项将使所有程序状态输出静音,从而允许来自例如或的-q
纯数据流。tar
gzip
答案4
除了上述所有好的回应和要点之外,最佳实践是为每个标志提供相反的选项。因此,如果需要-v
冗长,就应该-q
有不冗长、安静或沉默。 (但这不是讨论的重点......)每个短选项也应该有一个长选项,-q
并且--quiet
。
与我们业务中的几乎所有事情一样,有多种方法可以获得解决方案或相同的结果。拥有-q
就是其中之一。