【发布时间】:2016-05-20 18:00:51
【问题描述】:
重定向之间有什么区别 1>/开发/空 2>&1 和 2>&1 1>/dev/null
似乎第一个显示输出到标准输出,而不是第二个。
谁能解释一下! 谢谢
【问题讨论】:
标签: shell io-redirection
重定向之间有什么区别 1>/开发/空 2>&1 和 2>&1 1>/dev/null
似乎第一个显示输出到标准输出,而不是第二个。
谁能解释一下! 谢谢
【问题讨论】:
标签: shell io-redirection
在 Unix 中 ">" 代表将输出重定向到文件或其他地方。
"1>" - 代表标准输出管道的输出
"2>" - 代表标准错误(错误)管道的输出(错误进入此管道)
所以从你的问题来看,
"1>/dev/null" : 告诉系统将标准输出定向到保存在 /dev 中的 null(file)
"2>&1" :告诉系统将stderr管道的输出重定向到stdout管道输出的地方。因此,在这种情况下,您可以将 stdout 和 stderr 输出写入一个文件中。
虽然 "2>&1 1>" 这对我来说没有意义,因为它等同于 "2>&1"
PS。如果您对 &1 部分感到困惑,那么它用于解决当 1 是文件名时可能出现的歧义。
希望这对你有意义。
【讨论】:
稍微扩展一下 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。最终结果 - 只有“标准输出”被丢弃,“标准错误”仍将打印到您的终端。
【讨论】:
好的。这是一个非常古老的帖子。请参阅相关帖子here。我想在另一篇文章中回答这个评论“如果 & 表示文件描述符,那么为什么在 2 之前没有 &?” by user6708151,但我的声誉太低了。我将解释我解释 shell 重定向语法的方式。还没有人提到它,据我所知。
所以,我们有语法[x][operator][y],其中x 和y 是文件描述符,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 |
最后一列是每次重定向的最终结果。
【讨论】: