在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
链接地址: http://www.djcxy.com/p/25579.html
