Bash 回声的重定向';s标准输出为标准误差,是否仍在终端中产生输出?

Bash 回声的重定向';s标准输出为标准误差,是否仍在终端中产生输出?,bash,redirectstandardoutput,Bash,Redirectstandardoutput,我有点困惑,为什么当我将echo命令的标准输出重定向到标准错误时,为什么我仍然在终端中打印参数 这是我跑的路线 echo "potato" >&2 有人能给我解释一下吗?如果输出被重定向到其他地方,该命令如何输出 谢谢:)嗯,默认情况下,您的终端同时显示STDOUT和STDERR 所以,你看到的是STDERR 如果要隐藏STDERR:echo“potato”2>/dev/null>&2 > $ ls -l /proc/$$/fd/ total 0 lrwx------ 1

我有点困惑,为什么当我将echo命令的标准输出重定向到标准错误时,为什么我仍然在终端中打印参数

这是我跑的路线

echo "potato" >&2
有人能给我解释一下吗?如果输出被重定向到其他地方,该命令如何输出


谢谢:)

嗯,默认情况下,您的终端同时显示STDOUT和STDERR

所以,你看到的是STDERR

如果要隐藏STDERR:
echo“potato”2>/dev/null>&2

> $ ls -l /proc/$$/fd/
total 0
lrwx------ 1 foo foo 64 Dec 23 18:42 0 -> /dev/pts/3
lrwx------ 1 foo foo 64 Dec 23 18:42 1 -> /dev/pts/3
lrwx------ 1 foo foo 64 Dec 23 18:42 2 -> /dev/pts/3

/dev/null
是一个黑洞,您可以在其中重定向不希望看到的内容:)

,因为默认情况下,标准错误也显示在终端中。因此,您将标准输出重定向到标准错误,而标准错误又被重定向到控制台。结果不会改变。

我想你想要的是:

bash-3.2$ echo "potato" &>2
bash-3.2$ 
从bash的
man
页面:

Redirecting Standard Output and Standard Error
       Bash  allows  both  the  standard  output (file descriptor 1) and 
       the standard error output (file descriptor 2) to be redirected to the file 
       whose name is the expansion of word with this construct.

       There are two formats for redirecting standard output and standard error:

              &>word
       and
              >&word

       Of the two forms, the first is preferred.  This is semantically equivalent to

              >word 2>&1

首先,当终端和shell启动时,STDOUT和STDERR都指向终端输出。您的命令echo“potato”>&2要求将STDOUT重定向到STDERR所指向的位置。因此,这个命令根本没有效果

以下是一些参考资料:

  • 文件描述符0(FD0)的名称为STDIN
  • 文件描述符1(FD1)被命名为STDOUT
  • 文件描述符2(FD2)名为STDERR
  • 文件描述符3(FD3)及更多没有特殊名称
  • 默认情况下,任何unix程序最初都会打开所有这3个文件描述符
  • 默认情况下,STDIN指向输入设备(打开程序的终端),通常最后指向键盘
  • 默认情况下,STDOUT、STDERR指向控制台(终端)输出
  • >somefile
    1>somefile
    将文件描述符1重定向到名为“somefile”的文件,即将STDOUT指向“somefile”
  • n>somefile
    将文件描述符n重定向到名为“somefile”的文件,其中
    n
    =1,2,3<当省略
    n
    时,默认情况下code>n为1
  • n>&m
    将文件描述符n重定向到文件描述符m
  • 当我们说文件描述符n被重定向到文件描述符m时,实际上意味着文件描述符n被强制指向文件描述符m指向的对象,例如,终端输出设备/控制台
  • n>&-
    关闭文件描述符n,其中n=1,2,3
  • 重定向的顺序很重要。它们从左到右应用。见下例:


  • 在重定向和管道之间排序(首先是管道,然后是重定向)。因此,这个命令:
    command1>/dev/null | comamnd2
    首先在command1和command2之间创建管道,即将command1的STDOUT链接到command2的STDIN。然后,command1的STDOUT被重定向到/dev/null。这实际上取消了管道(断开管道)。因此,command2将看到STDIN输入的结束,即command2的STDIN关闭
因此,它解释了以下命令交换STDIN和STDOUT的原因:

$ (echo xx; ls xx) 3>&1 1>&2 2>&3 3>&- | wc -l
ls: cannot access xx: No such file or directory
1
  • 步骤1:创建管道后,FD1(左侧)指向“管道输出”。
    wc
    的FD0指向管道中
  • 步骤2:创建FD3,复制FD1,即指向管道输出
  • 步骤3:FD1现在更改为FD2指向的内容,即终端输出
  • 步骤4:FD2现在更改为FD3指向的对象,即管道输出
  • 步骤5:FD3关闭
净影响为: FD1现在指向终端输出。 FD2现在指向管道输出,管道输出到
wc
命令


希望这能有所帮助。

输出只需按指示的方向运行即可

默认情况下,文件描述符1和2指向同一位置(注意
&2
相当于
1>&2

现在让我们把其中一个文件描述符重定向到别处

> exec 1>foo
> ls -l /proc/$$/fd/
> exec 1>&2
> cat foo
total 0
lrwx------ 1 foo foo 64 Dec 23 18:42 0 -> /dev/pts/3
lrwx------ 1 foo foo 64 Dec 23 18:42 1 -> /home/foo/foo
lrwx------ 1 foo foo 64 Dec 23 18:42 2 -> /dev/pts/3    

请注意,
ls-l/proc/$$/fd/
的输出转到我们工作目录中的文件
foo
,而不是打印到stdout

echo“potato”和/dev/null
给了你什么?它没有给我任何输出,但这对我来说是有意义的,如果我仍然从中得到输出,我会感到困惑,这在我的问题中似乎是类似的情况。你的意思是为什么
&>2
&2
不同?这是因为
&2
被视为文件描述符。您正在重定向到名为
2
> exec 1>foo
> ls -l /proc/$$/fd/
> exec 1>&2
> cat foo
total 0
lrwx------ 1 foo foo 64 Dec 23 18:42 0 -> /dev/pts/3
lrwx------ 1 foo foo 64 Dec 23 18:42 1 -> /home/foo/foo
lrwx------ 1 foo foo 64 Dec 23 18:42 2 -> /dev/pts/3