`>> /dev/stderr` (带有空格)和 `>&2` 之间有什么区别?

`>> /dev/stderr` (带有空格)和 `>&2` 之间有什么区别?

在bash中。

我很难确定应该使用什么?

我所有的脚本都使用“>>/dev/stderr”

在 bash 提示符下,如果 我尝试:
echo test >>/dev/stderr有效
echo test >> /dev/stderr有效
echo test >/dev/stderr有效
echo test > /dev/stderr

echo test >>&2失败了!
echo test >> &2失败了!
echo test >&2工作
echo test > &2失败!

我愿意将我的所有脚本更改为>&2.

它似乎对 ssh (之后su SomeUser)也有很大的影响,其中>>/dev/stderr根本不起作用(权限被拒绝),只能>&2起作用。

答案1

>& nshell语法是直接复制文件描述符。文件描述符2是stderr;这就是它的工作原理。您还可以复制其他文件描述符,而不仅仅是 stderr。您不能在此处使用追加模式,因为复制文件描述符永远不会截断(即使您的 stderr 是一个文件)并且>&是一个标记,这就是为什么您不能在其中添加空格 - 但>& 2可以工作。

>> name是不同的允许语法,其中name是文件名(标记是>>)。在本例中,您使用的文件名/dev/stderr,通过特定于操作系统的处理(在 Linux 上,它是 的符号链接/proc/self/fd/2)也意味着标准错误。当 stderr 是终端时,追加和截断模式都会做同样的事情,因为它不能被截断。但是,如果您的标准错误是一个文件,那么它将要被截断:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

如果您在 ssh 上看到错误/dev/stderr,则服务器管理员可能应用了一些安全措施来阻止该符号链接工作。 (例如,您无法访问/proc/dev)。虽然我预计这两种方法都会导致各种奇怪的损坏,但使用重复的文件描述符语法是一种完全合理(并且可能稍微更有效)的方法。我个人更喜欢它。

答案2

失败案例的发生是因为bash语法用于&在重定向中指定单个>,并要求它直接与符号相邻&

[n]>&词

答案3

用于'>'重定向(如果存在则截断)或'>>'(如果存在则追加)。

用于'>&'复制流,例如,如果您希望在同一文件中标准输出和标准错误,则重定向到文件'> output.log'并出现错误'2>&'

myjob.sh > output.log 2>&

相关内容