发送输出到/ dev / stderr vs.>&2


11

在脚本中,错误通常使用传送到文件描述符2 &2,即:

echo "error" >&2

有时/dev/stderr代替使用:

echo "error" > /dev/stderr 

看一下/dev/stderr,我发现它只是到的符号链接/proc/self/fd/2,而这又是到/dev/pts/5(在我当前的终端上)的符号链接。

似乎有点复杂。这背后有逻辑吗?

是使用/dev/stderr&2等价吗?

是那些比其他的首选吗?


3
echo "error" >2创建一个具有名称2和内容的文件error
赛勒斯


我看到我的编辑重新引入了&2而不是2。您的问题实际上是关于>2或的用法>&2吗?
Jeff Schaller

Answers:


13

专用设备/dev/stderr是特定于系统的,而文件描述符2(不是专用设备/proc/self/fd/2)是可移植的。如果您想编写不可移植的代码,那么这些特殊的设备是一个很好的起点。

有一些系统可以使用/dev/stderr:Linux和OSX。但是OSX没有/proc文件系统,它/dev/stderr是的链接/dev/fd/2

进一步阅读:


还有有些情况下有人想做例如。这个2> bla.log只要这将工作,你管2,而不是硬编码/dev/stderr。基本上2并不需要stderr输出。
larkey '16

6

在bash和其他Shell中,将某些东西重定向标准错误的方法是使用>&2。Bash将/dev/stderr作为文件描述符 打开2。文件描述符通过&N哪里N是描述符的编号来引用。因此,echo error >&2将打印error到标准错误/dev/stderr

它还将/dev/stdout作为文件描述符打开1。这意味着您可以做到echo output >&1。但是,由于默认情况下所有内容都将被打印到标准输出中,因此其echo output本身就是相同的。

现在,2>是不同的。在这里,您将命令的错误输出重定向到其他位置。因此,2>file意味着“将打印到文件描述符2(标准错误)的所有内容重定向到file”。


3

您是对的,>&2是更直接,更完美的“惯用语”。它们应该是等效的,因此没有特别的理由要使用>/dev/stderr。除此之外,如果某人不知道该怎么做,那么其中一个可能比另一个更容易找到:-)。但总的来说,我建议您使用>&2

当程序将错误写入指定的文件名但不支持stderr时,/ dev / stderr可能会很有用。显然,这是人为的。/ dev / stdout更加有用。(我最近发现mysql_safe包装器脚本不会将错误写入控制台;不幸的是,它还想更改错误日志文件的权限,因此使用/ dev / stderr会引起一些不必要的警告)。

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.