默认情况下将 find 中的错误直接发送到 /dev/null

默认情况下将 find 中的错误直接发送到 /dev/null

在我的 OSX 命令行上,find将错误定向到。我觉得这很不方便,而且每次都将其添加到命令末尾STDOUT也很烦人。这带来了几个问题:2>/dev/null

  • 这是一个系统范围的设置吗(例如,错误是否STDOUT在 OSX 上直接发生但/dev/null在 Linux 上发生)还是特定于find
  • 有没有办法让 find 默认采取这种行为(无需创建别名)?
  • 如果是这样,是否需要第二个命令来恢复原来的行为?
  • 如果没有,有没有比更短的快捷方式2>/dev/null(例如unzip -qq代替unzip >/dev/null)?
  • 怎样在 Linux 机器上进行这种改变?

答案1

尽管两者都以相同的方式出现在你的终端上,但 STDERR不是被重定向到 STDOUT。

要检查我是否在撒谎,请尝试运行find生成错误的任何命令(没有任何重定向)并> example.file在其末尾放置。如果生成的错误出现在屏幕上,但没有出现在名为的生成文件中example.file,那么您就知道 STDERR 没有被重定向,因为如果是,则所有输出都会在生成的文件中。

当您添加时,2>/dev/null您所说的是“从 STDERR 获取所有输出并将其写入文件 /dev/null”。

这是一个系统范围的设置吗(例如,在 OSX 上错误是否直接发送到 STDOUT,但在 Linux 上错误是否直接发送到 /dev/null)还是特定于查找?

否;默认情况下,从终端运行程序时,STDIN、STDOUT 和 STDERR 都会复制到终端,但它们在内部的处理方式不同(即它们被别名为不同的文件描述符),就像在 Linux 中一样。默认情况下,运行程序时始终将错误打印到控制台,这样如果出现问题,您就会知道是什么、何时以及为什么。/dev/null就像一个黑洞;一旦信息进入,就无法取回。大多数人不希望错误输出神秘地消失在以太中,所以(据我所知没有 Linux 发行版)默认情况下会这样做。

有没有办法让 find 默认采取这种行为(无需创建别名)?

如果您想让 find 每次都以这种方式运行而不使用别名(这...我的意思是别名无论如何都不起作用,因为别名仅在您只想替换命令的开头时才起作用,而重定向必须位于末尾;我错了;重定向可以放在参数之间/之前而不会出现问题),一种方法是在 bash 中定义一个函数(我假设您使用 bash;如果这是一个错误,我深表歉意)如下:

find() { command find "$@" 2>/dev/null }

如果没有,是否有比 2>/dev/null 更短的快捷方式(例如,unzip -qq 而不是 unzip >/dev/null)?

如果您指的是这个的话,那么就没有任何配置文件、环境变量或方便的选项标志可供使用。

怎样在 Linux 机器上进行这种改变?

与 OSX 相同。如果您不想每次登录时都重新定义该函数,请将该行添加到文件~/.bashrc。虽然……仔细想想,我确实认为 OSX 有所不同。在 OSX 上,我非常确定您实际上必须将其添加到~/.bash_profile才能使其正常工作。

相关内容