echo>&2"some text"在shell脚本中意味着什么

Cur*_*ind 55 unix shell sh

我见过echo在很多地方都这样使用过:

echo >&2 message text ...
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

但我知道2>&1,我不知道如何解释上面的用法.

有人可以解释一下吗?

Jit*_*ite 104

要快速解释其他人遗漏的内容:

echo "hey" >&2

>重定向标准输出(隐式1>)

&接下来是文件描述符,而不是文件(仅用于右侧>)

2 stderr文件描述符号

stdoutecho命令重定向到stderr.(如果您要使用echo "hey" >2,则输出hey到一个名为的文件2)

  • 优秀的答案。现在甚至 ./someScript.sh 2>&1 也有意义了!谢谢! (2认同)

Mic*_*yan 24

>&2这里的用法是将输出发送到标准错误而不是标准输出.这通常是发送日志输出的更好的地方,这不是计算的实际结果,特别是如果结果打印到标准输出(可能重定向到文件)而不是某些其他文件输出(即将日志记录发送到标准错误确保它不会包含在重定向到输出文件的实际输出中.


Hen*_*eld 8

>&2重定向是一条捷径1>& 2.

您理解,2>& 1因此您将理解这将命令的stdout链接到当前的stderr


Dav*_*aku 7

虽然其他答案给出了很好的解释,但他们遗漏了这里提出的确切问题。最好的答案是直接对问题发表评论,但可惜的是,Stack Overflow 认为我不值得添加评论。

所以,引用三元组

命令行中重定向的 previse [ sic ] 位置并不重要。所有>&2 echo messageand echo >&2 messageecho message >&2都是等价的。

这正是我来寻找的确切问题,目前的答案都没有回答;他们只是解释我已经知道的事情。另一方面,这个问题可以从更好的措辞中受益,但同样,我被禁止发表评论,所以......

  • 我将再次补充一点,上述内容对于 _one_ 重定向来说是正确的。假设stdout和stderr指向tty,那么`1>/dev/null 2>&1`和`2>&1 1>/dev/null`不是一回事。前者将“stdout”和“stderr”重定向到“/dev/null”,后者将“stderr”重定向到当时指向的“stdout”(tty),然后将“stdout”重定向到“/” dev/null`,从而导致所有`stderr`输出仍然进入tty。 (3认同)