我知道什么
program > /dev/null 2>&1
做。它将输出重定向到/dev/null
并2>&1
意味着将错误输出重定向到发送输出的同一位置。
我的问题是我总是必须用谷歌搜索它,因为我从来不记得它。
所以,我尝试&2>1
,1>2&
...1>&2
我尝试每一种组合,直到我用谷歌搜索它...
有什么技巧可以轻松记住呢?
答案1
输出优于错误,因此输出优先(1 vs 2)。
>
是“去”的简写。左边是我要发送的内容,右边是我要发送的位置。由于“where”(几乎)总是一个文件,比如
program > /dev/null 2>1
将重定向到名为 1 的文件。因此,& 符号(&)
将文件修改为文件描述符。
不幸的是,我还没有遇到也没有开发出自己的助记符,但是当我第一次学习 *nix 时,我发现这种合乎逻辑的方法可以很好地工作。经过几次练习后,它就成为第二天性。
答案2
一个技巧是记住 1 = 标准输出,2 = 标准错误。所以:
2>&1
= 标准错误流进入标准输出流。
1>&2
= 反之亦然。
如果您曾经使用类 C 语言进行过编程,那么很容易记住与号 ( &
)。我选择将其视为引用现有文件描述符的“地址”,这样您就不会更改文件本身或创建新文件。
答案3
将 视为&
结可能会有所帮助:考虑一下您想要做什么,获取 2, so 的输出2>
,并将其与 1, so 绑在一起2>&1
答案4
让我们考虑这三个选项:
program 2>1
program 2>1&
program 2>&1
第一个将 stderr 发送到文件名“1”:毕竟,bash 期望重定向到文件。
第二个也重定向到同一个文件,但program
在后台运行:这就是尾随&
的含义。
这使得第三种可能性成为 bash 宇宙中唯一有意义的重定向到文件句柄的可能性。
如何记住0、1、2中的哪个?考虑一下从控制台运行计算机。首先,您必须输入一些内容(0=stdin)。然后,您会看到输出(1=stdout)。最后且仅当出现问题时,您才会看到 stderr (2)。