【问题标题】:Whats the difference between redirections "1>/dev/null 2>&1" and " 2>&1 1>/dev/null"?重定向“1>/dev/null 2>&1”和“2>&1 1>/dev/null”有什么区别?
【发布时间】:2016-05-20 18:00:51
【问题描述】:

重定向之间有什么区别 1>/开发/空 2>&1 和 2>&1 1>/dev/null

似乎第一个显示输出到标准输出,而不是第二个。

谁能解释一下! 谢谢

【问题讨论】:

标签: shell io-redirection


【解决方案1】:

在 Unix 中 ">" 代表将输出重定向到文件或其他地方。

"1>" - 代表标准输出管道的输出

"2>" - 代表标准错误(错误)管道的输出(错误进入此管道)

所以从你的问题来看,

"1>/dev/null" : 告诉系统将标准输出定向到保存在 /dev 中的 null(file)

"2>&1" :告诉系统将stderr管道的输出重定向到stdout管道输出的地方。因此,在这种情况下,您可以将 stdout 和 stderr 输出写入一个文件中。

虽然 "2>&1 1>" 这对我来说没有意义,因为它等同于 "2>&1"

PS。如果您对 &1 部分感到困惑,那么它用于解决当 1 是文件名时可能出现的歧义。

希望这对你有意义。

【讨论】:

  • 我帖子中的第一个命令似乎显示输出到标准输出,但不是第二个。
  • 如果抛出任何错误,您只会从 2> 流中获取输出。其余所有输出都将转到 1> 流。
【解决方案2】:

稍微扩展一下 Lokendra26 的回答:/dev/null 是您系统上的一个特殊文件,一个用于丢弃写入它的任何内容的设备。如果您不想看到它,通常会在那里发送输出。在这种情况下,“文件”和一般的 unix 术语可以是普通磁盘文件,也可以是空设备或终端等设备。

“1”和“2”是文件描述符,表示发送输出的位置。程序使用 FD 1“标准输出”作为普通输出的目标,使用 FD 2“标准错误”作为错误输出。这些文件描述符可以在不同的时间指向不同的文件。通常它们都指向您的终端,因此您可以看到那里编写的程序的输出。

& 运算符不仅仅是为了消除歧义。它实际上的意思是“查找此时此 FD 指向的任何内容”。

了解这些细节对于了解您所询问的两种重定向之间的区别非常重要。

1>/dev/null 2>&1这其实是两条语句,依次处理。首先,将“标准输出”指向空设备(从而丢弃写入它的任何内容)。其次,将“标准错误”指向任何“标准输出”所指向的位置,在本例中为 /dev/null。最终结果是两个文件描述符的输出都将被丢弃。

2>&1 1>/dev/null 同样是两个语句。首先,将“标准错误”指向“标准输出”指向的任何内容。通常这将是您的终端,正如我在上面所写的。其次,将“标准输出”指向/dev/null。最终结果 - 只有“标准输出”被丢弃,“标准错误”仍将打印到您的终端。

【讨论】:

    【解决方案3】:

    好的。这是一个非常古老的帖子。请参阅相关帖子here。我想在另一篇文章中回答这个评论“如果 & 表示文件描述符,那么为什么在 2 之前没有 &?” by user6708151,但我的声誉太低了。我将解释我解释 shell 重定向语法的方式。还没有人提到它,据我所知。

    所以,我们有语法[x][operator][y],其中xy 是文件描述符,operator 是重定向运算符。例如,[command] 1>/dev/stderr 丢弃来自[command] 的任何输出。 这里,x 是一个文件描述符变量,而 y 是一个文件描述符值。一个例子可以清楚地说明这一点。

    [command] 2>&1 表示 shell 将变量 1 的文件描述符值放入变量 2,实际上将错误输出重定向到标准输出。符号 & 在这里是必需的,因为它表示 1 是一个变量而不是文件名。

    要回答原始问题,请参阅下表。注意shell解析重定向是从左到右的,你还需要从左到右读取表格。

    1>/dev/null 2>&1

    Variable Default value 1>/dev/null 1>/dev/null 2>&1
    stdin 0 0 0
    stdout 1 /dev/null /dev/null
    stderr 2 2 /dev/null

    2>&1 1>/dev/null

    Variable Default value 2>&1 2>&1 1>/dev/null
    stdin 0 0 0
    stdout 1 1 /dev/null
    stderr 2 1 1

    最后一列是每次重定向的最终结果。

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2018-08-06
      • 2021-12-02
      • 2015-12-14
      • 2010-10-30
      相关资源
      最近更新 更多