cmd>/dev/null 2>&1如何工作?

hax*_*ode 11 unix linux bash shell

我正在阅读重定向数据/dev/null,所以我尝试了一个简单的测试:

ping a.b.c  # which results in an address not found
Run Code Online (Sandbox Code Playgroud)

如果我试试这个:

ping a.b.c > /dev/null # prints the same error message as the one above
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

ping a.b.c > /dev/null 2>&1 # The error message is gone
Run Code Online (Sandbox Code Playgroud)

最后的解决方案是理想的解决方案,但是发生了2>&1什么?到目前为止,我的研究表明,2代表stderr1代表stdout.因此,如果我以这种方式阅读,看起来我正在创建一个stderr文件并重定向stdout到它?

如果是这种情况,&该命令的作用是什么?

msb*_*msb 12

你是对的,2STDERR,1是的STDOUT.当你这样做时,2>&1你会说:"打印到STDOUT(1)将要去的东西STDERR(2)".在那之前,你说你STDOUT会去/dev/null.因此,没有看到任何东西.在示例1和2中,您将获得输出消息,因为它正在打印STDERR,因为常规重定向仅重定向STDOUT.

当你进行重定向时,你没有创建一个STDERR,进程总是有一个STDERR和一个STDOUT创建时.

  • @nkon如果需要,您实际上可以_see_哪些文件描述符附加到进程.要做到这一点,找到pid - 例如,`pgrep firefox`.然后`ls -l/proc/<pid>/fd` - 注意到fds实际上表示为目录中的符号链接!我仍然觉得这一切都令人着迷,自2002年以来我一直在运行Debian. (3认同)