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

Luc*_*c M 44 shell

我知道什么

  program > /dev/null 2>&1 
Run Code Online (Sandbox Code Playgroud)

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

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

所以,我尝试&2>1, 1>2&, 1>&2... 我尝试了每一种组合,直到我用谷歌搜索它...

有什么技巧可以轻松记住它?

gvk*_*vkv 22

输出优于错误,因此它排在第一位(1 对 2)。

>是“goes to”的简写。左边是我想发送的,右边是我想发送的地方。由于“where”(几乎)总是一个文件,例如

program > /dev/null 2>1
Run Code Online (Sandbox Code Playgroud)

将重定向到名为 1 的文件。因此,与号(&)将文件修改为文件描述符。

不幸的是,我没有遇到也没有开发出自己的助记符,但是当我第一次学习 *nix 时,我发现这种合乎逻辑的方法可以很好地工作。经过几次运行后,它成为第二天性。


小智 10

一个技巧就是记住 1 = 标准输出,2 = 标准错误。所以:

2>&1= 标准错误流进入标准输出流。
1>&2= 反之亦然。

如果您曾经用类似 C 的语言进行过编程,那么很容易记住与号 ( &)。我选择将其视为引用现有文件描述符的“地址”,这样您就不会更改文件本身或创建新文件。


小智 7

&看成一个结可能会有所帮助:想想你想要做的事情是取 2 的输出,所以2>,并将它与 1 联系在一起,所以2>&1

  • 我只是记住了“二出一”这句话。无论您的助记符是一个短语还是一个结,拥有一个真的会有所帮助。 (2认同)

Kev*_*ntu 5

实际上,这取决于您使用的外壳。Bash 通常非常宽容,你可以这样做:

program &> file
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 5

让我们考虑这三个选项:

program  2>1
program  2>1& 
program  2>&1
Run Code Online (Sandbox Code Playgroud)

第一个将 stderr 发送到名为“1”的文件:毕竟,bash 希望重定向到一个文件。

第二个也重定向到同一个文件,但program在后台运行:这就是尾随的&意思。

这使得第三种可能性成为 bash 世界中唯一有意义的重定向到文件句柄的可能性。

如何记住 0、1、2 中的哪个?考虑从控制台运行计算机。首先,您必须输入一些内容 (0=stdin)。然后,您会看到输出 (1=stdout)。最后,只有在出现问题时,您才会看到 stderr (2)。