默认情况下查找/ dev / null中的直接错误


0

在我的OSX命令行上, find 将错误指向 STDOUT。我发现这非常不方便,我也觉得添加很烦人 2>/dev/null 到每次命令的最后。这提出了几个问题:

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

2> 重定向STDERR,而不是STDOUT。你可以跑 exec 2>/dev/null 从那一点开始将所有STDERR重定向到bitbucket。此外,定义函数比别名更合适。
choroba

Answers:


1

虽然两者都以同样的方式出现在你的终端上,但STDERR却是 被重定向到STDOUT。

要检查我是否在说谎,试试运行什么 find 命令生成错误(没有任何重定向)和put > 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 而是让它工作。


我一直都在用 alias find='find 2>/dev/null',shell不关心重定向在参数列表中的位置,并在它们作用于它们时将其删除,程序(查找)永远不会看到重定向请求。
lornix
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.