输出重定向中的 & 到底是什么意思?

输出重定向中的 & 到底是什么意思?

command 1> out我看到像或用于重定向 stderr 之类的东西2>&1,但有时我也会看到&>它本身,等等。

最好的理解方式是什么&以及它到底意味着什么?

答案1

&中的只是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 error( ls: cannot access 'j1': No such file or directory) 和standard output( )均已koko2发送至文件output

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

./koko > output

执行cat output后,您只会看到koko2类似内容。但看不到命令​​的错误输出ls j1。这些错误输出将被发送到standard error您将在终端中看到的。

感谢@Byte Commander 的重要说明:

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

答案2

> FILE 2>&1&> FILE是等价的。参见8.2.3.2. 错误重定向Bash 初学者指南第 8 章

答案3

[n]>&word称为复制输出文件描述符(看第 2.7.6 节POSIX Shell 语言标准)。这种特殊行为是 Bourne 类 Shell 的特征,包括kshdashbash;事实上,该标准基于 Bourne shell 和ksh。深入研究tcsh韓軟體手册,它们显然不提供复制任何文件描述符的能力,但是从的描述来看>&,这表现得像&>bash(即将错误和正常输出重定向到文件)。

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

2>&1 告诉 shell 为命令提供一个文件描述符 2,它是描述符 1 的重复。(即 stderr 和 stdout 指向同一个 fd)。

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

这当然超出了标准错误和标准输出的范围。如这个答案, 通过做3&>2

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

操作文件描述符的示例包括:将命令的输出捕获dialog到变量中

还值得注意的是,&>特定于bash。在zsh其行为相同,但根据文档,“...在多操作系统存在的情况下,其效果与‘> word 2>&1’不同”。在 POSIX 兼容中/bin/sh,这将被视为常规重定向,并将命令置于后台。另请参阅,是否存在语法上无效的 bash 代码的 sh 代码?

也可以看看:

相关内容