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

Aqu*_*wer 11 bash ssh io-redirection stderr

在 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起作用。

der*_*ert 23

>& n直接复制文件描述符的shell 语法。文件描述符 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案可以改进。>& 是一个标记而不是两个标记,这就是 OP 的困惑所在。 (3认同)

Jef*_*ler 8

发生失败的原因是在重定向中使用的bash 语法&指定了一个>, 并且要求它直接与&符号相邻:

[n]>&word