这是做什么的?我找不到&1
中&2
和bash
的内容的任何信息。
$ echo "Hello" >&1
Hello
$ echo "Hello" >&2
Hello
$ echo "Hello" >&3
bash: syntax error near unexpected token `&'
我知道您可以将标准和错误输出重定向到文件,但在这些情况下&符号会做什么?
答案 0 :(得分:3)
>&
是>
管道操作的变体。虽然>
将输出重定向到命名文件(或文件系统中设备的表示,例如/dev/console
),但>&
会将输出重定向到标准输出流之一。最常用的exaples是stream 1(stdout)和stream 2(stderr)。请注意,您可以在>
或>&
运算符前面使用相同的数字来说明要重定向的流的输出。
echo "hello" >&1
是多余的;你正在将stdout重定向到stdout。
(echo "hello" 1>&1
当然也意味着同样的事情。)
一个更有趣的例子:echo "hello" 2>&1
将echo命令的错误输出从stderr重定向到stdout,将它们组合成一个流。如果您想通过单个管道运行所有输出而不是单独处理它们,那么这个通常很有用。例如,echo "hello" 2>&1 | tee log
将正常输出和错误消息的副本捕获到单个日志文件中。
BroSlow指出,在bash
shell的版本4及更高版本中,|&
可用作组合流的简写,相当于2>&1
。很高兴知道。 (我仍然经常在shell之间移动以开始使用那个。)
答案 1 :(得分:1)
Bash有几个用于输入和ouptut的文件描述符。
现在,对于您的示例,如果从文件描述符中拆分&
,则可能更容易查看。 >&
和>&
在功能上都是等效的,并且从给定的文件描述符重定向到另一个。所以在你的例子中:
echo命令会将你给它的任何内容打印到stdout(1),在这种情况下你会重定向到stdout,所以重定向不会改变任何东西。
$ echo "Hello" >& 1
重定向echo命令的输出,而不是转到stdout转到stderr。
$ echo "Hello" >& 2
重定向echo命令的输出,而不是转到stdout bash尝试将其发送到文件描述符3,但它尚未分配,因此bash引发错误。
$ echo "Hello" >& 3
例如,您可以将其分配给/ dev / stdout,然后获得与第一个重定向示例相同的结果。
$ exec 3<> /dev/stdout
$ echo "Hello" >& 3
Hello
答案 2 :(得分:0)
1 is stdout Standard Out
2 is stderr Standard Error
& indicates that what follows is a file descriptor and not a filename ("fold a file descriptor into another")
常用代码是将stdderr重定向到stdout
2>&1
然后
mycommand 2>&1 1>logfile
或
mycommand > afile.txt 2>&1