重定向"1>/dev/null 2>&1"和"2>&1 1>/dev/null"之间有什么区别?

27 浏览
0 Comments

重定向"1>/dev/null 2>&1"和"2>&1 1>/dev/null"之间有什么区别?

1>/dev/null 2>&1 和 2>&1 1>/dev/null 之间有什么区别?

第一个似乎将输出显示到标准输出(stdout),而第二个则不会。

有人可以解释一下吗!

谢谢

0
0 Comments

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

"1>" - 表示来自标准输出(stdout)的输出流

"2>" - 表示来自标准错误(stderr)的输出流(错误信息会发送到这个流中)

所以从你的问题来看,

"1>/dev/null":告诉系统将标准输出重定向到位于/dev目录下的null文件(相当于将标准输出丢弃)

"2>&1":告诉系统将标准错误的输出重定向到标准输出的位置。所以在这种情况下,你会得到将标准输出和标准错误输出写入同一个文件中。

而"2>&1 1>"对我来说没有意义,因为它相当于"2>&1"。

PS. 如果你对"&1"部分感到困惑,那是为了解决当1是文件名时可能出现的歧义。

希望这对你有意义。

看起来,我帖子中的第一个命令将输出显示到标准输出,而第二个命令则没有。

只有在有错误抛出时,你才会从2>流中得到输出。其他所有输出都将发送到1>流中。

0
0 Comments

在这个问题中,用户想要知道重定向语句“1>/dev/null 2>&1”和“2>&1 1>/dev/null”的区别。为了解释这个问题,我们需要理解shell重定向语法的解释方式,并提供对应的解决方法。

用户提到的语法为“[x][operator][y]”,其中x和y是文件描述符,operator是重定向操作符。例如,“[command] 1>/dev/stderr”表示将命令[command]的输出丢弃到/dev/stderr中。在这个例子中,“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

最后一列是每个重定向语句的最终结果。

通过分析上述表格,我们可以得出结论:

- “1>/dev/null 2>&1”将标准输出和错误输出都重定向到/dev/null。

- “2>&1 1>/dev/null”将错误输出重定向到标准输出,然后将标准输出重定向到/dev/null。

因此,这两个重定向语句的区别在于重定向的顺序。在第一个语句中,先将标准输出重定向到/dev/null,然后将错误输出重定向到与标准输出相同的位置。而在第二个语句中,先将错误输出重定向到标准输出,然后将标准输出重定向到/dev/null。

希望通过这篇文章,读者能够理解重定向语句“1>/dev/null 2>&1”和“2>&1 1>/dev/null”的区别以及解决方法。

0
0 Comments

什么是重定向"1>/dev/null 2>&1"和"2>&1 1>/dev/null"之间的区别?

在Lokendra26的回答的基础上进行扩展:/dev/null是系统上的一个特殊文件,用于丢弃写入其中的任何内容。如果您不想看到输出,将其发送到/dev/null是很常见的。在这种情况下,“文件”和Unix术语一般可以是普通的磁盘文件,也可以是空设备或终端设备。

"1"和"2"是文件描述符,用于指定输出位置。程序使用FD 1(标准输出)作为普通输出的目标,使用FD 2(标准错误)作为错误输出。这些文件描述符可以在不同的时间指向不同的文件。通常它们都指向您的终端,因此您可以在终端上看到程序的输出。

"&"操作符不仅仅用于消除歧义。它实际上表示“查找此时此刻FD所指向的内容”。

为了理解您所询问的两个重定向之间的区别,理解这些细节是很重要的。

`1>/dev/null 2>&1`实际上是两个语句,按顺序处理。首先,将“标准输出”指向空设备(从而丢弃写入其中的任何内容)。其次,将“标准错误”指向“标准输出”所指向的内容,即/dev/null。最终的结果是丢弃了两个文件描述符的输出。

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

0