混淆输出重定向为2>&1?

Exp*_*ing 6 linux bash shell ksh

我已经在stackoverflow和其他关于2>&1的使用的来源中检查了几个相关帖子.

不幸的是到目前为止还没有彻底解决它.

我知道2是stderr,1是stdout,我们正在与2>&1结合.

但我的问题是:有什么区别:

1. mycommand > /dev/null       
2. mycommand 2> /dev/null      
3. mycommand > /dev/null 2>&1  
Run Code Online (Sandbox Code Playgroud)

我刚在想:

  1. 将stdout和stderr重定向到/ dev/null
  2. 将stderr重定向到/ dev/null
  3. 将stdout和stderr重定向到/ dev/null

相关帖子:

cha*_*aos 13

看到这个:

mycommand > /dev/null

它会将mycommand的通道1(stdout)重定向到/ dev/null

mycommand 2> /dev/null

它会将通道2(stderr)重定向到/ dev/null

mycommand > /dev/null 2>&1

它会将通道1重定向到/ dev/null,然后将通道2(stderr)绑定到通道1(stdout).两者都将进入/ dev/null

还有一个(只是为了完成)

mycommand 2>&1 > /dev/null

在第二种情况下,我将(孩子的)stderr绑定到stdout(父节点)然后我找到孩子的stdout到/ dev/null.结果是你现在在stdout上得到了孩子的stderr输出,stdout转到了文件.例如,这对于处理管道中的stderr非常有用.(见这个答案)

  • @Baishakh不,`cmd>/dev/null 2>&1`与`cmd 2>&1/dev/null`非常不同.第一个将两个流定向到/ dev/null.第二个将stdout指向/ dev/null,stderr被发送到重定向到/ dev/null之前的任何stdout.通过'parent',chaos指的是解析命令行的shell,'child'是被调用的命令. (4认同)
  • @Baishakh,用这种方式想到`x 2>&1>/dev/null`:文件描述符1最初指向一个物理文件,比如/ dev/stdout.`2>&1`将fd 2重定向到(/ dev/stdout)的fd 1点.然后将fd 1重定向到/ dev/null.最后一次重定向不会影响fd 2现在指向的内容.所以,从左到右是正确的.`x>/dev/null 2>&1`的工作方式类似:首先将fd 1重定向到/ dev/null,然后将fd 2重定向到当前指向的fd 1. (3认同)