输出重定向的确切含义是什么?


19

我看到的东西一样command 1> out2>&1重定向标准错误,但有时我也看到&>本身等

最好的理解&方法是什么?它的确切含义是什么?

Answers:


26

&2>&1只是说该号码1是一个文件描述符,而不是文件名。在这种情况下standard output file descriptor

如果使用2>1,则会将错误重定向到一个名为的文件,1但如果使用2>&1,则将其发送至standard output stream

&>表示将standard output和都发送standard error到某个地方。例如,ls <non-existent_file> &> out.file。让我用一个例子来说明。

设定:

  1. 创建一个koko具有以下内容的文件:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. 使它可执行: chmod u+x koko

  3. 现在注意,j1这不存在

  4. 现在运行 ./koko &> output

  5. 运行cat output,你会看到

    ls: cannot access 'j1': No such file or directory
    koko2
    

两者,standard errorls: cannot access 'j1': No such file or directory)和standard outputkoko2),被发送到文件output

现在再次运行它,但是这次是这样的:

./koko > output

这样做cat output,您只会看到koko2类似的图像。但不是ls j1命令输出的错误。这将被发送到standard error您将在终端中看到的。

感谢@Byte Commander的重要说明:

请注意,command >file 2>&1重定向的顺序很重要。如果您改写command 2>&1 >file(通常不是您想要的),它将首先将命令重定向stdout到文件,然后将命令重定向stderr到现在未使用的文件stdout,因此它将显示在终端中,您可以通过管道对其进行重定向或重定向。再次,但不会将其写入文件。


2
什么&>意思
AJJ

1
请注意,command >file 2>&1重定向的顺序很重要。如果您command 2>&1 >file改为写(通常不是您想要的内容),它将首先将命令的stdout重定向到文件,然后将命令的stderr重定向到其现在未使用的stdout,因此它将显示在终端中,您可以通过管道进行传输或再次重定向,但不会将其写入文件。
字节指挥官

2
“这将被发送到standard output您将在终端中看到的。” 这不应该是“对standard error”吗?
frarugi87

1
是的@ frarugi87您的权利纠正
乔治Udosen

1
@乔治哇,你太快了;)
做得好


1

[n]>&word被称为仿型输出文件描述符(见节2.7.6 POSIX shell语言标准)。这种特殊的行为是类似Bourne外壳,包括功能kshdash以及bash; 实际上,该标准基于Bourne shell和ksh。展望的tcshcsh的手册,他们显然没有提供任何复制文件描述符的能力,但是从描述中>&,这表现为&>bash(即重定向错误和正常输出到文件)。

在* nix之类的系统(包括Ubuntu)中,您经常会听到一切都是文件,或者更确切地说是文件描述符。标准输出是常量文件描述符1,标准错误是文件描述符2。因此,从> FILE 2>&1技术上讲,它意味着将文件描述符2复制到文件描述符1上。换句话说,此答案

2>&1告诉外壳程序给命令一个文件描述符2,它是描述符1的副本(即stderr&stdout指向相同的fd)。

此处的关键是要注意必须首先设置描述符1。因为shell以从左到右的顺序处理重定向,所以command >FILE 2>&1告诉shell重新连接stdout command进入FILE,然后描述符2才能成为1的副本,即1和2指向相同的位置- FILE

当然,这超出了标准误差和标准输出。如该答案所示3&>2

...您将文件描述符2复制(dup2)到文件描述符3上,如果文件描述符3已经打开,则可能将其关闭

在许多文件中,操纵文件描述符的示例是将命令的输出捕获dialog到变量中

还值得注意的&>bash。在zsh这种情况下,其行为相同,但是根据文档,“ ...在multios的情况下,与'> word 2>&1'的作用不同”。在POSIX兼容中/bin/sh,将命令放入后台将被视为常规重定向。另请参见,是否有在语法上不是有效的bash代码的sh代码?

也可以看看:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.