虽然两者都以同样的方式出现在你的终端上,但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
而是让它工作。
2>
重定向STDERR,而不是STDOUT。你可以跑exec 2>/dev/null
从那一点开始将所有STDERR重定向到bitbucket。此外,定义函数比别名更合适。