在bash中做什么&>?

这个问题在这里已经有了答案:

  • 在shell中,“2>&1”是什么意思? 15个答案

  • 我们在这里使用的操作符是:

  • >语法:file_descriptoropt > file_name
  • >&语法:file_descriptoropt >& file_descriptor
  • &>语法: &> file_name
  • 如果省略了文件描述符,则默认值为0 (stdin)用于输入,或者1 (stdout)用于输出。 2意味着stderr。

    所以我们有:

  • >name表示1>name - 将stdout重定向到文件name
  • &>name表示1>name 2>name - 将stdout和stderr重定向到文件name
  • 所以,当你写git status 2&>1 ,它就是git status 2 1>1 2>1 ,即

  • 实际上前2作为参数传递给git status
  • stdout被重定向到名为1的文件(不是文件描述符1)
  • stderr被重定向到名为1的文件
  • 这个命令实际上应该创建一个名为1的文件,其内容是git status 2的结果 - 即文件2的状态,可能是“你的分支是最新的,没有提交,工作目录干净”,假设你实际上并没有跟踪一个叫做2的文件。


    &>word (和>&wordstdoutstderr重定向到单词扩展的结果。在上面的情况下是文件1

    2>&1stderr (fd 2)重定向到stdout (fd 1)的当前值。 (之前在重定向stdout之前这样做并没有达到你所期望的效果,并且会分割输出而不是保持它们的组合,并且是一种非常常见的shell脚本错误。将这种情况与>word 2>&1相结合,将两个fds合并为一个发送到相同的位置。)

    $ { echo stdout; echo stderr >&2; }
    stdout
    stderr
    $ { echo stdout; echo stderr >&2; } >/dev/null
    stderr
    $ { echo stdout; echo stderr >&2; } >/dev/null 2>&1
    $ 
    { echo stdout; echo stderr >&2; } 2>&1 >/dev/null
    stderr
    

    不是说这些是相似的,而是相同的。

    实际上, git status 2&>1 > /dev/null实际上正在运行git status 2 ,其中&>1stdoutstderr到文件1 )的重定向。 几乎肯定不是打算的。 你的改正几乎可以肯定是预期的。

    $ git init repro
    Initialized empty Git repository in /tmp/repro/.git/
    $ cd repro/
    $ git status
    # On branch master
    #
    # Initial commit
    #
    nothing to commit
    $ ls
    $ git status 2>&1
    # On branch master
    #
    # Initial commit
    #
    nothing to commit
    $ ls
    $ git status 2&>1
    $ ls
    1
    $ cat 1
    # On branch master
    #
    # Initial commit
    #
    nothing to commit
    
    链接地址: http://www.djcxy.com/p/25579.html

    上一篇: What does &> do in bash?

    下一篇: List all environment variables from command line?