在阅读有关 Linux 的文章时,我得到了以下信息:
由于 stderr 与 stdout 不同,在上面的示例中,错误消息仍会在终端窗口上看到。
如果要将 stderr 重定向到单独的文件,可以使用 stderr 的文件描述符编号 (2)、大于号 (>),后跟要保存正在运行的命令写入 stderr 的所有内容的文件的名称:
$ do_something 2> error-file
可以使用特殊的简写符号将写入文件描述符 2 (stderr) 的任何内容放在与文件描述符 1 (stdout) 相同的位置:2>&1
$ do_something > all-output-file 2>&1
bash 允许使用更简单的语法来实现上述操作:
$ do_something >& all-output-file
这do_something
是一些命令。我真的不明白上面提到的所有 3 个命令到底发生了什么。我知道&
用于将进程变为后台进程,但我不明白其中的逻辑。我对这种风格还不熟悉,有人能解释一下吗?
答案1
您可能会感到困惑,因为>&
这与完全是两回事&
。
>&
或<&
用于重定向以指向文件描述符 (fd)。上述情况重定向到 1 和 2,分别是 stdout 和 stderr。
>
表示“重定向标准输出”
2>
表示“重定向 fd 2 (stderr)”
>&2
表示“将 stdout 重定向到 fd 2 (stderr)”。请注意,这与>2
“将 stdout 重定向到名为 的文件2
”有何不同 - 这就是 为何 如此&
重要的原因。它表示下一个内容将是 fd,而不是文件名。
当然,正如您所说,如果 a&
本身没有重定向符号,那么它的含义就完全不同了——“立即返回,在后台运行前面的命令”。