Answers:
输出胜于错误,因此输出优先(1 vs 2)。
>
是“前往”的简写。左边是我要发送的内容,右边是我要发送的内容。由于“ where”(几乎)始终是文件,因此类似
program > /dev/null 2>1
将重定向到名为1的文件。因此,“&”号(&)
将文件修改为文件描述符。
不幸的是,我没有遇到过自己的助记符,也没有开发过自己的助记符,但是当我第一次学习* nix时,我发现了这种合理的工作方式。经过几次尝试后,它就成为了第二天性。
stdout
是文件描述符1,stderr
是2。因此,“错误”在“输出”之前。
stdout
和stderr
引用的助记符。
将其&
视为一个结可能会有所帮助:考虑将2的输出so 2>
,然后将其与1绑定在一起,以考虑要执行的操作2>&1
将其绘制在墙纸中。
现在,认真地讲,我一直忘了这些以及其他基本内容,因此我向自己开发的应用程序中添加了一个快速提示菜单,该应用程序我每天都会使用。您可能想尝试一下,或使用gnote之类的东西来做笔记。
关于bash shell,我发现记住的最佳方法是通过了解正在发生的事情。
如果您只想记住如何正确设置命令,则可以尝试
program > /results 2> /results
那是很明显的事情,很容易记住。即
1
STDOUT将 /results
2
STDERR也要去直接到/results
问题是这不符合您的预期。考虑以下:
文件: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
然后运行命令
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
然后
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
这里发生了什么?
我的理解是bash设置重定向,将STDERR 直接指向文件,/tmp/results
并且由于其性质,>
它会做两件事
>>
。因此,在这种情况下,STDERR直接插入到/tmp/results
覆盖STDOUT输出的开头。
注意:如果您过去>>
附加了内容,则可能无法使用此语法。
但是,要解决此问题,您需要-无需直接将STDERR重定向到文件,而是将 STDERR的输出合并到STDOUT流中,这样就不会发生冲突。
使用运算2>&1
符运算符可实现此目的
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
在&
允许的bash从一个文件名为区分 1
和1
文件描述符。
对我来说,该语句2>&1
本身可以准确说明正在发生的事情-STDERR本身已在STDOUT上重定向-并最终以/tmp/results
这种方式指向STDOUT(几乎是副作用)。
与许多指南所声称的相反,这是2>&1
将STDERR发送到任何指向STDOUT的位置。如果是这样-您仍然会遇到覆盖问题。
有关更多信息,请参见-http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
。有时候,您确实需要将stdout
和混合stderr
在一起以查看实际情况-例如将复杂的编译过程的输出重定向到文件。在那种情况下,我最终将其谷歌搜索