在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