首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >>/dev/null 2>&1 &与</dev/null &>/dev/null &之间的差异

>/dev/null 2>&1 &与</dev/null &>/dev/null &之间的差异
EN

Unix & Linux用户
提问于 2019-01-28 14:23:42
回答 2查看 6.7K关注 0票数 6

我一直在使用以下方法从终端启动程序:

代码语言:javascript
复制
program_name >/dev/null 2>&1 &

但是最近我遇到了本网页,其中推荐了以下方法:

代码语言:javascript
复制
program_name </dev/null &>/dev/null &

我知道第一个是什么意思了。它意味着将stderr指向stdout,stdout指向/dev/null,即stderr和stdout现在都指向null。

但第二个是什么意思呢?哪一个更适合从终端无头启动程序?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-01-28 14:49:49

默认情况下,运行程序时会打开三个“标准”文件:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。在Unix中,这些与“文件描述符”相关联(stdin = 0,stdout = 1,stderr = 2)。默认情况下,这三者都与控制您的终端的设备(在屏幕上看到内容并在程序中输入输入的接口)相关联。

shell使您能够“重定向”文件描述符。>操作符重定向输出;<重定向输入。

例如:

代码语言:javascript
复制
program_name > /dev/null

相当于:

代码语言:javascript
复制
program_name 1> /dev/null

将输出重定向到文件描述符1(“stdout”)到‘/dev/null’

西米拉利

代码语言:javascript
复制
program_name 2> /dev/null

将输出重定向到文件描述符2(“stderr”)到“/dev/null”

您可能希望将stdoutstderr重定向到单个文件,因此您可能认为应该这样做:

代码语言:javascript
复制
program_name > /dev/null 2> /dev/null

但这并不能处理对文件描述符的交错写入(这背后的细节是一个不同的问题)。要解决这个问题,您可以这样做:

代码语言:javascript
复制
program_name > /dev/null 2>&1

它表示“将写入文件描述符1重定向到/dev/null,并将写入文件描述符2重定向到与写入文件描述符1的位置相同的位置”。这将处理对文件描述符的交错写入。

这个选项非常常见,以至于有些shell包含一个短手,它的长度更短,功能也相当:

代码语言:javascript
复制
program_name &> /dev/null

最后,您可以用重定向输出的方式重定向输入:

代码语言:javascript
复制
program_name < /dev/null

将文件描述符0 (stdin)从/dev/null重定向,所以如果程序试图读取输入,就会得到EOF。

把这一切加在一起:

代码语言:javascript
复制
program_name </dev/null &>/dev/null &

假设(1)运行program_name,(2)将标准输入从/dev/null (</dev/null)重定向,(3)将文件描述符1和2 (stdoutstderr)重定向到/dev/null (&>/dev/null),(4)在后台运行程序(&)。

票数 17
EN

Unix & Linux用户

发布于 2022-01-06 12:37:47

对于> /dev/null,您实际上是在对该事件进行空化。

对于2>&1,您要将任何错误流文本重定向到输出流。当有人试图运行一个在执行时实际抛出错误的命令时,这将是最好的理解。只需按原样使用该命令两次,另一次使用2>&1 post命令即可。

希望这至少对新手用户有帮助。谢谢。

票数 -1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/497207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档