我在哪里指导输出?

时间:2014-01-10 22:51:03

标签: linux bash shell

这是做什么的?我找不到&1&2bash的内容的任何信息。

$ echo "Hello" >&1
Hello

$ echo "Hello" >&2
Hello

$ echo "Hello" >&3
bash: syntax error near unexpected token `&'

我知道您可以将标准和错误输出重定向到文件,但在这些情况下&符号会做什么?

3 个答案:

答案 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的文件描述符。

  • 1 是stdout
  • 2 是stderr
  • 3-9 可用于其他i / o(例如,如果您使用1从文件循环中的文件读取,则可以使用3来读取用户输入)< / LI>
  • 10 + 通常在内部使用bash,但如果需要可以从bash请求

现在,对于您的示例,如果从文件描述符中拆分&,则可能更容易查看。 >&>&在功能上都是等效的,并且从给定的文件描述符重定向到另一个。所以在你的例子中:

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