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将 /results2STDERR也要去直接到/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在一起以查看实际情况-例如将复杂的编译过程的输出重定向到文件。在那种情况下,我最终将其谷歌搜索