我怎么记得如何使用重定向?

我怎么记得如何使用重定向?

我知道什么

  program > /dev/null 2>&1 

做。它将输出重定向到/dev/null2>&1意味着将错误输出重定向到发送输出的同一位置。

我的问题是我总是必须用谷歌搜索它,因为我从来不记得它。

所以,我尝试&2>11>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)。

相关内容