详细理解“>/dev/null 2>&1”

Linux系统中无论是crontab里面,还是平时使用的命令,经常会碰到">/dev/null 2>&1"。比如说:在Crontab
Job里面,如果不想发送邮件,那么有两种方法:

  • 一是将MAILTO="", 设置为空
[[email protected] etc]# cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
  • 二是将关闭某个命令的输出结果,将其重定向到/dev/null中。

1 1 * * * /sbin/ping -c 5 www.sohu.com > /dev/null 2>&1

1 2 * * * /sbin/ping -c 5 www.sohu.com > /dev/null 

则第一个crontab,即使ping失败,都不会有邮件发出,

而第二个crontab,如果ping失败,会在/var/spool/mail目录或/var/spool/clientmqueue目录下生成大量的错误输出提示邮件。

那么如何理解">/dev/null 2>&1",可以拆开来理解:

 >        :重定向,例如 echo "Hello" > /root/1.txt

1>  stdout:表示标准输出,默认是1

2>  stderr:表示标准错误

 &        :表示等同于,2>&1,表示标准错误重定向,等同于标准输出

/dev/null :表示空设置文件,类似于Win系统中的垃圾箱

因此,“>/dev/null 2>&1”也可以写成“1>/dev/null 2>&1”

那么本文标题的语句执行过程为:

1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。

2>&1 :接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

比如说: 

ping a.b.c                  # 错误信息 ping:unknown host a.b.c
ping a.b.c > /dev/null      # 错误信息同上,因为只是将标准输出摒弃
ping a.b.c > /dev/null 2>&1 # 而如果这么写的话,屏幕不会显示错误信息,这其实丢弃标准输出及错误输出
  • command > file 2>file
  • command > file 2>&1

相同点:上面两个命令都可是实现将执行command后的,标准及错误输出重定向到file文件中。

不同点: I/O效率上的差异

command 1>file 2>file 这样的写法,stdout和stderr都直接送到file中,
file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file的管道。

 

command 1>file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。从I/O效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,最多的时候我们会command
1>file 2>&1 这样的写法, 或 "command >file 2&1"

详细理解“>/dev/null 2>&1”

时间: 2024-10-16 06:27:38

详细理解“>/dev/null 2>&1”的相关文章

关于/dev/null 和 /dev/zero文件详解以及误删/dev/null和/dev/zero的解决方法和利用/dev/zero进行磁盘IO测试方法

1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF.在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole).空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件.这些操作通常由重定向完成. /dev/zero  : 在类UNIX 操作系统中, /dev/zero 是

2>&1 >/dev/null & 与/dev/null 2>&1含义

/dev/null 代表空设备文件 > 代表重定向到哪里,例如:echo "123" > /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到

Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF.在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole).空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件.当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00). 其中的一个典型用法

转 Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比

1.概论 -- 来自维基的解释 /dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF.在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole).空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件.这些操作通常由重定向完成. /dev/zero  : 在类UNIX 操作系统中, /dev/zero 是

shell中>/dev/null 2>&1

本文转自http://www.kissyu.org/ 背景 我们经常能在shell脚本中发现>/dev/null 2>&1这样的语句.以前的我并没有去深入地理解这段命令的作用,照搬照用,直到上周我将这段命令不小心写成了2>&1 >/dev/null,出了一点小问题之后,我才开始去了解这段命令背后的"玄机". shell重定向介绍 就像我们平时写的程序一样,一段程序会处理外部的输入,然后将运算结果输出到指定的位置.在交互式的程序中,输入来自用户的键

[转帖]linux中systemctl详细理解及常用命令

linux中systemctl详细理解及常用命令 2019年06月28日 16:16:52 思维的深度 阅读数 30 https://blog.csdn.net/skh2015java/article/details/94012643 一.systemctl理解 Linux 服务管理两种方式service和systemctl systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动. systemd对应的进程管理命令是sy

shell脚本中>/dev/null 2>&1具体说明

简述: shell脚本中经常会出现在一个命令cmd后面跟着 >/dev/null 2>&1,本文详细理清一下shell重定向. 为什么需要重定向? shell脚本在执行的过程中,会有一些系统打印,有的是标准输出,有的是错误输出,这里的错误输出不一定是指shell脚本有问题,而是系统打印的一些异常或者错误输出,不影响系统运行的.一般shell脚本都是相较复杂多指令的.这里有个问题,C语言程序中调用shell脚本,一般是用 system 来调用,这里就有一个问题,system执行过程中,s

shell输出的那个垃圾桶——/dev/null

昨晚花费一整晚在知乎回答了一个关于shell里面的重定向输出到/dev/null的问题.果断今晚也同步发在这里,反正也没人看~~~~ 以下来自一个重度linux使用患者不请自来的回答. 先用简单的语言回答题主的问题: shell程序中 2> /dev/null 代表什么意思? 答:"2> /dev/null" 代表忽略掉错误提示信息. 如题 2> 代表什么意思?讲错误输出删除? 答:"2>" 代表重定向操作错误提示信息.只有这两个字符并不能删

>/dev/null 2>&1的含义

转帖:http://www.cnblogs.com/dkblog/archive/2009/07/31/1980722.html os.system("/etc/init.d/winbind stop >/dev/null 2>&1") >/dev/null 将输出重定向到/dev/null,这是个空设备,也就是忽略其输出.2>&1 是将错误输出到标准输出,如果在控制台调试,也就是屏幕上,方便调试.有3个默认的i/o,0是标准输入,一般是键盘:1