在shell中,“ 2>&1 ”是啥意思?

Posted

技术标签:

【中文标题】在shell中,“ 2>&1 ”是啥意思?【英文标题】:In the shell, what does " 2>&1 " mean?在shell中,“ 2>&1 ”是什么意思? 【发布时间】:2010-10-23 12:38:28 【问题描述】:

在 Unix shell 中,如果我想将 stderrstdout 组合到 stdout 流中以进行进一步操作,我可以在命令末尾附加以下内容:

2>&1

所以,如果我想在g++ 的输出上使用head,我可以这样做:

g++ lots_of_errors 2>&1 | head

所以我只能看到前几个错误。

我总是记不住这个,我经常去查,主要是因为我不完全理解这个特殊技巧的语法。

有人可以分解并逐个解释2>&1 的含义吗?

【问题讨论】:

@dbr 我不认为这只是 bash - 我相信这是一个 bourne shell 的东西;因此 sh、bash、ksh、ash、dash 等。 这是重定向段落的一部分,描述 POSIX 兼容的 shell,或简称 POSIX shell。例如,ksh 是一个 POSIX shell。见:pubs.opengroup.org/onlinepubs/009695399/utilities/… 这个结构也适用于 Windows。 通常2>&1 比2>/dev/null 更好;-) 如果你使用 zsh,我想我会提到 |&2>&1 | 的简写。我不能说这是否适用于其他类似 bourne 的 shell,或者它是否是 zsh 唯一的功能。 【参考方案1】:

文件描述符 1 是标准输出 (stdout)。 文件描述符 2 是标准错误 (stderr)。

这是记住这个结构的一种方法(尽管它并不完全准确):起初,2>1 可能看起来像是将stderr 重定向到stdout 的好方法。但是,它实际上会被解释为“将stderr 重定向到名为1 的文件”。 & 表示后面和前面的是文件描述符而不是文件名。所以构造变成:2>&1

>& 视为重定向合并运算符。

【讨论】:

但是不应该是&2>&1吗? @Dominik:不,& 仅在重定向上下文中被解释为表示“文件描述符”。写command &2>&被解析为command &2>&1,即“在后台运行command,然后运行命令2并将其stdout重定向到它的stdout”。 他们为什么选择这样神秘的东西?只是好奇。 但是如何将 stderr 重定向到名为 '&1' 的文件? @Martin: 2>'&1'【参考方案2】:
echo test > afile.txt

将标准输出重定向到afile.txt。这和做的一样

echo test 1> afile.txt

要重定向标准错误,你可以这样做:

echo test 2> afile.txt

>& 是将流重定向到另一个文件描述符的语法 - 0 是标准输入,1 是标准输出,2 是标准错误。

您可以通过以下方式将标准输出重定向到标准错误:

echo test 1>&2 # or echo test >&2

反之亦然:

echo test 2>&1

所以,简而言之...2> 将 stderr 重定向到(未指定)文件,附加 &1 将 stderr 重定向到 stdout。

【讨论】:

这对你有意义吗,java ... 2&1 >> data.log,我看到我的一位同事这样做了? @Harry 看起来像是不是 bash 的外壳,或者是拼写错误。cmd 2>&1 >> somefile.log 会将 stdout/stderr 附加到文件中 - 它与上面的基本相同,>> file追加 @dbr cmd 2>&1 >>file 不会将 stderr 重定向到文件,但 cmd >> file 2>&1 会。订单很重要。在第一种情况下,stderr 被重定向到 shell 的 stdout(如果命令是交互式输入的,可能是 tty),然后 stdout 被定向到文件。第二种情况,stdout被定向到文件,然后stderr被定向到同一个地方。 我喜欢上面的答案,但它可能会更清晰一些。 "2>&1" 将标准错误重定向到标准输出的目标。因此,如果您有类似 "ls -l >> directoryContents 2>&1" 的内容,结果将是一个名为 directoryContents 的文件,其中将附加工作目录的内容。如果执行中有任何错误:错误消息也会在发生时附加到 directoryContents 文件中。 0(or 1,2)>&0(or 1,2) 是否像控制输出的选项? echo test >test.log 2>&1echo test 2>&1 >test.log 一样吗?【参考方案3】:

关于重定向的一些技巧

关于此的一些语法特殊性可能具有重要的行为。有一些关于重定向、STDERRSTDOUT 和参数ordering 的小示例。

1 - 覆盖还是追加?

符号> 表示重定向

> 表示发送到作为一个完整的完整文件,如果存在则覆盖目标(请参阅后面的#3 中的noclobber bash 功能)。 >> 表示 除了发送之外 将附加到目标(如果存在)。

无论如何,如果文件不存在,就会创建该文件。

2 - shell 命令行 取决于顺序!!

为了测试这一点,我们需要一个简单的命令,它会在两个输出上发送一些东西

$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

(当然,希望您没有名为/tnt 的目录;)。好吧,我们有它!

那么,让我们看看:

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

最后一个命令行将STDERR 转储到控制台,这似乎不是预期的行为......但是......

如果你想对标准输出、错误输出或两者都做一些后过滤

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->

请注意,本段中的最后一个命令行与上一段完全相同,我在前一段中写道似乎不是预期的行为(因此,这甚至可能是预期的行为)。

嗯,有一些关于重定向的小技巧,用于对两个输出进行不同的操作

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2  2>&1  | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan  7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory

注意&amp;9 描述符会因为) 9&gt;&amp;2 而自发出现。

附录:nota! 在新版本的 bash (&gt;4.0) 中,有一个新功能和更性感的语法来执行此类操作:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory

最后对于这样的级联输出格式:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
     1  O: drwxrwxrwt 118 root root 196608 Jan  7 12:29 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

附录:nota! 相同的新语法,两种方式:

$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
     1  O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

STDOUT 通过特定过滤器,STDERR 到另一个,最后合并的两个输出通过第三个命令过滤器。

3 - 关于noclobber 选项和&gt;| 语法的一句话

关于覆盖

虽然 set -o noclobber 指示 bash 覆盖任何现有文件,但 &gt;| 语法可以让您突破这个限制:

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:21 CET 2013

文件每次都会被覆盖,现在好了:

$ set -o noclobber

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

通过&gt;|:

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013

取消设置此选项和/或询问是否已设置。

$ set -o | grep noclobber
noclobber           on

$ set +o noclobber

$ set -o | grep noclobber
noclobber           off

$ date > $testfile ; cat $testfile
Mon Jan  7 13:24:27 CET 2013

$ rm $testfile

4 - 最后一招和更多...

对于从给定命令重定向 both 输出,我们看到正确的语法可能是:

$ ls -ld /tmp /tnt >/dev/null 2>&1

对于这种特殊情况,有一个快捷语法:&amp;&gt; ... 或&gt;&amp;

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

注意:如果 2&gt;&amp;1 存在,1&gt;&amp;2 也是正确的语法:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4b- 现在,我让你想想:

$ ls -ld /tmp /tnt 2>&1 1>&2  | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1  | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

4c- 如果您对更多信息感兴趣

您可以通过点击阅读精美的手册:

man -Len -Pless\ +/^REDIRECTION bash

在bash 控制台中;-)

【讨论】:

延伸阅读:如果你喜欢这个,你可以欣赏:How redirection abuse could give strange behaviours 延伸阅读 ||:A function to store both output into separated variables 这是最好的答案,真的很酷。 感谢您的解释 - 真的很有帮助 @fabs 如果你喜欢这个,也许你会喜欢Open new window for input/output 和/或Redirections from script himself【参考方案4】:

我发现这篇关于重定向的精彩帖子:All about redirections

将标准输出和标准错误重定向到文件

$ 命令 &>文件

这一单行程序使用&amp;&gt; 运算符将输出流(stdout 和stderr)从命令重定向到文件。这是 Bash 将两个流快速重定向到同一目的地的快捷方式。

这是 Bash 重定向两个流后文件描述符表的样子:

如您所见,stdout 和 stderr 现在都指向file。因此,写入 stdout 和 stderr 的任何内容都会写入file

有几种方法可以将两个流重定向到同一个目的地。您可以一个接一个地重定向每个流:

$命令>文件2>&1

这是将两个流重定向到文件的更常见的方法。首先将 stdout 重定向到文件,然后将 stderr 复制为与 stdout 相同。所以两个流最终都指向file

当 Bash 看到多个重定向时,它会从左到右处理它们。让我们通过这些步骤,看看这是如何发生的。在运行任何命令之前,Bash 的文件描述符表如下所示:

现在 Bash 处理第一个重定向 > 文件。我们以前见过这个,它使标准输出指向文件:

Next Bash 看到第二个重定向 2>&1。我们以前没有见过这种重定向。这将文件描述符 2 复制为文件描述符 1 的副本,我们得到:

两个流都已重定向到文件。

但是这里要小心!写作

命令>文件2>&1

不等于写:

$ 命令2>&1>文件

在 Bash 中重定向的顺序很重要!此命令仅将标准输出重定向到文件。 stderr 仍将打印到终端。要了解为什么会发生这种情况,让我们再次执行这些步骤。所以在运行命令之前,文件描述符表是这样的:

现在 Bash 处理从左到右的重定向。它首先看到 2>&1,因此它将 stderr 复制到 stdout。文件描述符表变为:

现在 Bash 看到第二个重定向 &gt;file,并将 stdout 重定向到文件:

你看到这里发生了什么吗?标准输出现在指向文件,但标准错误仍然指向终端!写入 stderr 的所有内容仍会打印到屏幕上!所以要非常非常小心重定向的顺序!

还要注意,在 Bash 中,写作

$ 命令 &>文件

完全一样:

$ 命令>&文件

【讨论】:

如果“command”以数字结尾,则最后两个不同,因为那将被视为&gt;&amp;的可选文件描述符 非常漂亮的绘图和解释!您能否详细说明“重复”的真正含义?您提到,“这个 [2>&1] 将文件描述符 2 复制为文件描述符 1 的副本”。听起来标准错误被复制到标准输出。但如果是这样的话,我是否也应该看到/dev/tty0 的错误? 这是一个非常好的视觉解释。如果我成为提出这个问题的人,我会将其标记为已接受的答案。【参考方案5】:

数字指的是文件描述符 (fd)。

零是stdin 一个是stdout 二是stderr

2&gt;&amp;1 将 fd 2 重定向到 1。

如果程序使用它们,这适用于任意数量的文件描述符。

忘记了可以看/usr/include/unistd.h

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

也就是说,我编写了使用非标准文件描述符进行自定义日志记录的 C 工具,因此除非将其重定向到文件或其他内容,否则您看不到它。

【讨论】:

只使用自己的“非标准文件描述符”可以吗?你怎么知道没有同一个 FD 的打开文件?【参考方案6】:

该构造将标准错误流 (stderr) 发送到标准输出 (stdout) 的当前 位置 - 这个货币问题似乎已被其他答案忽略。 p>

您可以使用此方法将任何输出句柄重定向到另一个输出句柄,但它最常用于将 stdoutstderr 流引导到单个流中进行处理。

一些例子是:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

请注意,最后一个不会stderr 定向到outfile2 - 它会将其重定向到遇到参数时的stdout (outfile1),然后 stdout 重定向到outfile2

这允许一些非常复杂的诡计。

【讨论】:

虽然最后一个例子会更清楚: foo >outfile2 2>outfile1 更清楚,是的,但这不会显示重定向的“位置”性质。该示例是人为设计的,因为在一行中执行此操作通常没有用 - 当不同方负责重定向的不同部分时,该方法变得非常有用。例如,当一个脚本做了一个重定向,而你用另一个重定向运行它。 我刚刚意识到最后一个示例也解决了我长期以来一直存在的困惑:some_program 2&gt;&amp;1 &gt; /dev/null 不能像这样工作:some_program &gt; /dev/null 2&gt;&amp;1 你对最后一个例子的评论值得它的金字:-)我从没想过这些重定向参数是位置的......我认为了解这一点非常重要。【参考方案7】:

如果您是初学者阅读this,我发现这对您很有帮助

更新: 在 Linux 或 Unix 系统中,程序将输出发送到两个位置:标准输出 (stdout) 和标准错误 (stderr)。您可以将这些输出重定向到任何文件。 就像你这样做 ls -a &gt; output.txt 控制台中不会打印任何内容所有输出 (stdout) 被重定向到输出文件。

如果您尝试打印任何未退出文件的内容,则意味着输出将出现错误,例如您打印当前目录中不存在的 test.txtcat test.txt &gt; error.txt 输出将是

cat: test.txt :No such file or directory

但是error.txt 文件将会是空的,因为我们将stdout 重定向到了一个不是stderr 的文件。 所以我们需要文件描述符(文件描述符只不过是一个代表打开文件的正整数。你可以说描述符是文件的唯一ID)来告诉shell我们将哪种类型的输出发送到文件。在Unix / Linux系统中1 用于标准输出,2 用于标准错误。 所以现在如果你这样做 ls -a 1&gt; output.txt 意味着你正在将标准输出 (stdout) 发送到 output.txt。 如果您这样做 cat test.txt 2&gt; error.txt 意味着您将标准错误 (stderr) 发送到 error.txt 。 &amp;1 用于引用文件描述符 1 (stdout) 的值。 现在,2&gt;&amp;1 的意思是“将标准错误重定向到我们重定向标准输出的同一位置” 现在你可以这样做了

cat maybefile.txt &gt; output.txt 2&gt;&amp;1 标准输出 (stdout) 和标准错误 (stderr) 都将重定向到 output.txt。

感谢Ondrej K.指出

【讨论】:

仅链接的答案是有问题的。链接可能会失效,导致答案无用。您应该始终在答案本身中包含足够的细节。【参考方案8】:

2 是控制台标准错误。

1 是控制台标准输出。

这是标准的 Unix,Windows 也遵循 POSIX。

例如当你跑步时

perl test.pl 2>&1

标准错误被重定向到标准输出,所以你可以同时看到两个输出:

perl test.pl > debug.log 2>&1

执行后,你可以在 debug.log 中看到所有的输出,包括错误。

perl test.pl 1>out.log 2>err.log

然后标准输出到out.log,标准错误到err.log。

我建议你试着理解这些。

【讨论】:

第二个示例错误:由于顺序优先STDERR被重定向到STDOUT,只会写入默认的STDOUTdebug.log(不是 STDERR)见 my answer(第 2 段)!为了确保 both 被重定向到同一个文件,您必须反转重定向指令:perl test.pl &gt; debug.log 2&gt;&amp;1【参考方案9】:

2&gt;&amp;1 是一个 POSIX shell 结构。以下是逐个标记的细分:


2: "标准错误" 输出文件描述符。

&gt;&amp;Duplicate an Output File Descriptor 运算符(Output Redirection 运算符 &gt; 的变体)。给定[x]&gt;&amp;[y],由x 表示的文件描述符将成为输出文件描述符y 的副本。

1 "标准输出" 输出文件描述符。

表达式2&gt;&amp;1 将文件描述符1 复制到位置2,因此在执行环境中写入2(“标准错误”)的任何输出都会转到最初由1 描述的文件( “标准输出”)。


进一步解释:

File Descriptor: "每个进程唯一的非负整数,用于标识打开的文件以进行文件访问。"

标准输出/错误:请参阅 shell 文档的 Redirection 部分中的以下注释:

打开的文件由从零开始的十进制数字表示。最大可能值是实现定义的;但是,所有实现都应支持至少 0 到 9(含),以供应用程序使用。这些数字称为“文件描述符”。值 0、1 和 2 具有特殊含义和常规用途,并且由某些重定向操作隐含;它们分别称为标准输入、标准输出和标准错误。程序通常从标准输入中获取输入,并将输出写入标准输出。错误消息通常写在标准错误上。重定向操作符前面可以有一个或多个数字(不允许插入字符)来指定文件描述符编号。

【讨论】:

【参考方案10】:

回答您的问题:它接受任何错误输出(通常发送到 stderr)并将其写入标准输出(stdout)。

当您需要对所有输出进行分页时,这很有帮助,例如“更多”。一些程序喜欢将使用信息打印到标准错误中。

帮助你记住

1 = 标准输出(程序打印正常输出) 2 = 标准错误(程序打印错误)

"2>&1" 只是将发送到 stderr 的所有内容指向 stdout。

我还建议阅读this post on error redirecting,其中详细介绍了该主题。

【讨论】:

【参考方案11】:

程序员的角度来看,这恰恰意味着:

dup2(1, 2);

请参阅man page。

了解2&gt;&amp;1 是一个副本也解释了为什么...

command >file 2>&1

... 不等于 ...

command 2>&1 >file

第一个将两个流发送到file,而第二个将错误发送到stdout,普通输出到file

【讨论】:

【参考方案12】:

人们,永远记住paxdiablo关于重定向目标当前位置的提示......它很重要。

2&gt;&amp;1 运算符的个人记忆是这样的:

认为&amp; 表示'and''add'(字符是ampers-,不是吗?) 所以它变成:'将2 (stderr) 重定向到 1 (stdout) 已经/当前所在的位置,并添加两个流'

同样的助记符也适用于其他常用的重定向,1&gt;&amp;2

想想&amp; 的意思是andadd...(你明白与号有关的意思吧?) 所以它变成:'将1 (stdout) 重定向到 2 (stderr) 已经/当前所在的位置,并添加两个流'

并且永远记住:你必须从右到左(不是从左到右)“从头到尾”阅读重定向链。

【讨论】:

【参考方案13】:

重定向输入

输入重定向导致文件名 由要打开以读取文件的单词扩展的结果 描述符 n,或者如果 n 是标准输入(文件描述符 0) 未指定。

重定向输入的一般格式是:

[n]<word

重定向输出

输出重定向导致文件 名称是由要打开以进行书写的单词的扩展产生的 文件描述符 n,或标准输出(文件描述符 1)如果 n 未指定。如果文件不存在,则创建它;如果它 确实存在它被截断为零大小。

重定向输出的一般格式是:

[n]>word

移动文件描述符

重定向运算符,

[n]<&digit-

将文件描述符数字移动到文件描述符 n,或者 如果未指定 n,则为标准输入(文件描述符 0)。 digit被复制到n后关闭。

同样,重定向操作符

[n]>&digit-

将文件描述符数字移动到文件描述符 n,或者 如果未指定 n,则标准输出(文件描述符 1)。

参考:

man bash

键入/^REDIRECT 以定位到@​​987654328@ 部分,并了解更多...

在线版本在这里:3.6 Redirections

PS:

很多时候,man 是学习 Linux 的强大工具。

【讨论】:

【参考方案14】:

假设您的系统上不存在/foo/tmp 存在……

$ ls -l /tmp /foo

将打印/tmp 的内容并打印/foo 的错误消息

$ ls -l /tmp /foo > /dev/null

/tmp的内容发送到/dev/null并打印/foo的错误消息

$ ls -l /tmp /foo 1> /dev/null

会做同样的事情(注意1

$ ls -l /tmp /foo 2> /dev/null

将打印/tmp的内容并将错误信息发送给/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

会将列表和错误消息发送到/dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

是简写

【讨论】:

【参考方案15】:

这就像将错误传递给标准输出或终端一样。

也就是说,cmd 不是命令:

$cmd 2>filename
cat filename

command not found

错误是这样发送到文件的:

2>&1

标准错误被发送到终端。

【讨论】:

【参考方案16】:

unix_commands 2&gt;&amp;1

这用于向终端打印错误。

以下说明流程

当产生错误时,它们被写入标准错误内存地址&amp;2“缓冲区”,标准错误流2从中引用。 产生输出时,写入标准输出内存地址&amp;1“缓冲区”,标准输出流1引用。

因此,获取unix_commands 标准错误流2,并将&gt; (错误)流重定向到标准输出内存地址&amp;1,以便将它们流式传输到终端并打印。

【讨论】:

【参考方案17】:

0 表示输入,1 表示标准输出,2 表示标准错误。

一个提示somecmd &gt;1.txt 2&gt;&amp;1 正确,而somecmd 2&gt;&amp;1 &gt;1.txt 完全错误没有效果!

【讨论】:

【参考方案18】:

请注意,1&gt;&amp;2 不能与 2&gt;&amp;1 互换使用。

想象你的命令依赖于管道,例如:docker logs 1b3e97c49e39 2&gt;&amp;1 | grep "some log" grepping 将在 stderrstdout 上发生,因为 stderr 基本上合并到 stdout 中。

但是,如果您尝试:docker logs 1b3e97c49e39 1&gt;&amp;2 | grep "some log", grepping 根本不会真正搜索任何地方,因为 Unix 管道通过连接 stdout | stdin 连接进程,而在第二种情况下,stdout 被重定向到 Unix 管道不感兴趣的 stderr

【讨论】:

以上是关于在shell中,“ 2>&1 ”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

理解 shell 脚本中的常见用法: 2>&1

Linux shell中2;&1的含义

这里的“2>&1”是啥意思? [复制]

shell 中 标准输出和错误输出

如何理解Linux shell中的“2>&1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))

实验理解Linux SHELL 输入输出重定向