" echo>& 2 message"," echo message>& 2"中重定向的位置之间的差异&& 34;>& 2 echo message"

时间:2015-01-13 08:54:05

标签: bash cmd

我遇到了重定向符号的不同位置(><)。例如:

echo>&2 message
message

echo message >&2
message

>&2 echo message
message

对于所有表格,我得到了相同的结果。我使用重定向来文件(>filename)而不是重定向到流(>&2)。我还使用了输入重定向(<filename)。 bash和windows cmd中的结果相同。

重定向位置有什么不同吗?

P.S。我在书中只看到了“echo message&gt;&amp; 2”表格。

3 个答案:

答案 0 :(得分:1)

shell中的X>&Y流重定向仅使用dup2(2)系统调用替换一个与流相关联的文件描述符(stdin,{{ 1}},stdout或其他),与另一个。

基本上,stderr字面上是2>&1意思&#34;将FD 2附加到当前连接的FD 1上,可能先关闭FD 2&#34;。

这有两个基本属性:

  • 为了使其正常工作,用于替换现有文件描述符的文件描述符必须已经代表我们希望附加描述符的文件/设备。

  • 一旦我们用另一个文件描述符替换了一个文件描述符,然后重新打开该文件描述符作为其他文件/设备的替换,两个文件描述符就会断开连接。因此,订单很重要:

    dup2(2, 1)

    没关系,因为它基本上是

    foo >/dev/null 2>&1
    

    将FD 2和1打开到同一个文件&#34; / dev / null&#34;, 而

    // 1) do >/dev/null
    close(1);
    fd = open("/dev/null", O_WRONLY, 0666); // fd will be == 1 on success.
    // 2) do 2>&1
    dup2(2, 1);
    

    首先将fd 2附加到附加到fd 1的同一文件中,然后立即将fd 1重新附加到新文件 - foo 2>&1 >/dev/null - 将fd 2仍然打开到fd 1附加到的任何时间第一次重定向:

    /dev/null

答案 1 :(得分:1)

对于简单命令

echo >&2 message是唯一不同的,它不同之处仅在于它与POSIX sh规范不兼容;支持任何位置的重定向都是bash扩展。

>&2 echo messageecho message >&2完全相同,并且在POSIX sh标准中保证对两者的支持。

对于复合命令

重定向仅在复合命令结束时有效。也就是说:

while read -r line; do printf '%s\n' "$line"; done <file

...有效,但

<file while read -r line; do printf '%s\n' "$line"; done

...不保证POSIX支持。

复合命令中的位置将应用于各个子命令,因此允许在命令中的任何位置重定向的bash扩展名在此处没有意义。

正式语法

下面引用了POSIX shell语法规范:

cmd_prefix       :            io_redirect
                 | cmd_prefix io_redirect
                 |            ASSIGNMENT_WORD
                 | cmd_prefix ASSIGNMENT_WORD
                 ;
cmd_suffix       :            io_redirect
                 | cmd_suffix io_redirect
                 |            WORD
                 | cmd_suffix WORD
                 ;
simple_command   : cmd_prefix cmd_word cmd_suffix
                 | cmd_prefix cmd_word
                 | cmd_prefix
                 | cmd_name cmd_suffix
                 | cmd_name
                 ;
command          : simple_command
                 | compound_command
                 | compound_command redirect_list
                 | function_definition
redirect_list    :               io_redirect
                 | redirect_list io_redirect
                 ;

因此,在实现没有扩展名的POSIX sh的shell中:

  • 允许在cmd_prefixcmd_suffix内进行重定向,即。在简单命令的开头或结尾
  • 复合命令的结尾(仅限)允许重定向。

答案 2 :(得分:0)

查看bash guide,尤其是文件描述符部分。命令将标准输入重定向到标准错误。如果您按2>/dev/null过滤,则会看到消息消失。希望这有帮助。