为什么许多命令提供“安静”选项?


37

通过将标准输出重定向到null文件可以轻松实现同一目的,为什么许多命令提供该选项-q--quiet抑制输出?


3
我认为这主要是为了方便起见。
Janis

7
并非所有命令都-q用于禁止所有输出。例如,Docker有一个列出图像的命令。docker images显示带有大量信息的格式化表格,同时docker images -q输出图像ID的明文列表(可用于传递至其他命令)。
new123456 2015年

Answers:


71
  • 尽管您可以轻松地在Shell中进行重定向,但在其他情况下却不那么容易,例如在不使用Shell命令行的情况下以另一种语言执行命令时。即使在外壳中:

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    打印包含的所有文件的大小foo。如果您重定向到/dev/null,则会同时丢失findgrep输出。您需要诉诸-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(即产生一个额外的shell)。

  • grep -q foo 比输入短 grep foo > /dev/null
  • 重定向到/dev/null意味着输出仍然被写入然后被丢弃,这比不写入(不分配,准备输出要写入)的效率低。
  • 可以进行进一步优化。在的情况下grep,例如,用以来-qgrep知道不需要输出,它一旦退出,因为它找到第一个匹配。使用grep > /dev/null,它仍会尝试查找所有匹配项。
  • 安静不一定意味着沉默。对于某些命令,这意味着减少冗长程度(与相反-v|--verbose)。例如,mplayer具有--quiet--really-quiet。使用某些命令,您可以-qqq减少3次详细程度。

值得注意的是,如果考虑到可移植性,则建议在grep手册页中避免使用-q,和选项-sgrep的提前退出是一项重要的优化,但并非所有具有此类选项的程序都能做到这一点;curl -s仍将处理所有数据(但第三点仍然适用,从而节省了处理时间)。
Janis

6
@Janis,这将是非常旧系统的可移植性。两者-q-s都由POSIX指定。如果我们考虑使用的系统过旧,那么我的系统也sh -c '...' sh {} \;将无法工作(对于ksh基于shs的早期版本)。
斯特凡Chazelas

手册页中提到:USG风格的grep也缺少-q,但其-s选项的行为类似于GNU grep。-我认为行为上的差异可能是个问题。我无法判断其相关性。
Janis

当我只关心脚本中命令的返回代码时,经常使用-q和--quiet选项。上面提到的原因甚至是更好的例子。
马克·斯图尔特

@StéphaneChazelas:您会惊讶于许多系统(部分)仍然这么旧...(嗯,实际上,没有那么多^^但仍然有一些)
Olivier Dulac

3

当感觉到需要在屏幕上记录笔记时,它仍然允许发出命令,但通常不会发出任何命令。如果将全部重定向到null,则没有机会看到输出。


好吧,安静意味着没有人期望得到回应。如果我们仍然看到输出,那将是意外的。(如果要打印(在终端连接的过程中)“确实非常重要”的东西,则该过程可以直接使用tty / pty设备。例如,可以是交互式查询密码等。 )
Janis 2015年

2

尽管它可能取决于命令,-q但也会禁用输出到stderr。这样可以避免不容易将stderr转换为stdout的外壳(我在看着您cshtcsh)以避免产生噪音。

某些程序在某些情况下会提供“安静”的选项,而您可能不想让其他一些有意义的输出充满状态消息。该-q或同等会关闭所有的程序状态输出,允许从,比如说一个纯粹的数据流,targzip


0

除了上面所有的好的回应和观点。最好的做法是为每个标志提供相反的选项。因此,如果有-v表示详细程度,则应该有-q表示非详细程度,相当或安静。(这不是讨论的重点,但是...)对于每个短选项-q和--quite,应将其作为长选项。

就像我们业务中的几乎所有事物一样,有很多方法可以得到解决方案或获得相同的结果。使用-q是其中之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.