在bash中做什么&>?
这个问题在这里已经有了答案:
我们在这里使用的操作符是:
>语法: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 。 1的文件(不是文件描述符1) 1的文件   这个命令实际上应该创建一个名为1的文件,其内容是git status 2的结果 - 即文件2的状态,可能是“你的分支是最新的,没有提交,工作目录干净”,假设你实际上并没有跟踪一个叫做2的文件。 
  &>word (和>&word将stdout和stderr重定向到单词扩展的结果。在上面的情况下是文件1 。 
  2>&1将stderr (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 ,其中&>1 ( stdout和stderr到文件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
