在我的 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
才能使其正常工作。