在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
>& 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
如果您在 ssh 上看到错误/dev/stderr
,则服务器管理员可能应用了一些安全措施来阻止该符号链接工作。 (例如,您无法访问/proc
或/dev
)。虽然我预计这两种方法都会导致各种奇怪的损坏,但使用重复的文件描述符语法是一种完全合理(并且可能稍微更有效)的方法。我个人更喜欢它。
答案2
失败案例的发生是因为bash语法用于&
在重定向中指定单个>
,并要求它直接与符号相邻&
:
[n]>&词
答案3
用于'>'
重定向(如果存在则截断)或'>>'
(如果存在则追加)。
用于'>&'
复制流,例如,如果您希望在同一文件中标准输出和标准错误,则重定向到文件'> output.log'
并出现错误'2>&'
myjob.sh > output.log 2>&