`

shell里的/dev/null 2>&1详解

 
阅读更多
shell中可能经常能看到:>/dev/null 2>&1

命令的结果可以通过%>的形式来定义输出

分解这个组合:“>/dev/null 2>&1” 为五部分。

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

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

那么本文标题的语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

最常用的方式有:
   
command > file 2>file  与command > file 2>&1

它们有什么不同的地方吗?
      首先command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command  > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道。
      而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
      从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。


作者: Sjolzy | Google+
地址: http://sjolzy.cn/shell-in-the-dev-null-2-gt-amp-1-Detailed.html


加上</dev/null,是什么意思?
google结果:
the "< /dev/null" unattaches the console keyboard and uses "< /dev/null" instead. This will allow the program to run in the background without being blocked.
仅仅是后台?
我这边有本地机器A,需要ssh 机器B"a.sh start"
a.sh中有这么一个
二进制cmd
执行后
然后exit 0

问题在于我远程ssh执行"a.sh start"

执行完之后一直hang在那里,并没有正常完成关闭连接并回到本地机器A的终端,而调试显示cmd以及exit 0是执行成功的。
在a.sh中
无论是
cmd > /dev/null 2>&1
还是
cmd &
都是hang在那里。

cmd > /dev/null </dev/null 2>&1
则是可以的



这区别就在于程序编写中判别标准输入啊,当没看到标准输入文件结束程序就不退出.
一旦标准输入是/dev/null,马上就看到标准输入结束了
  • 大小: 10.3 KB
  • 大小: 13.4 KB
分享到:
评论

相关推荐

    详解nohup /dev/null 2&gt;&1 含义的使用

    在 `nohup /mnt/Nand3/H2000G &gt;/dev/null 2&gt;&1 &` 这个例子中,`&gt;/dev/null` 表示将标准输出(文件描述符 1)重定向到 `/dev/null`,这是一个特殊的设备文件,任何写入它的数据都会被丢弃,相当于“黑洞”。`2&gt;&1` ...

    详解shell中&gt;/dev/null 2&gt;&1到底是什么

    在Shell脚本中,我们经常会遇到`&gt;/dev/null 2&gt;&1`这样的重定向操作,它是用来处理命令的输出和错误的。接下来,我们将详细解释这个命令的含义和作用。 首先,`&gt;/dev/null`是将标准输出(标准输出的文件描述符为1)...

    详解shell中/dev/null 2&1到底是什么

    相信大家经常能在shell脚本中发现&gt;/dev/null 2&gt;&1这样的语句。以前的我并没有去深入地理解这段命令的作用,照搬照用,直到上周我将这段命令不小心写成了2&gt;&1 &gt;/dev/null,出了一点小问题之后,我才开始去了解这段...

    linux-shell编程

    /bin/tar -cf /backup/$1.$DATE.tar $1 &gt; /dev/null 2&gt;&gt; /backup/$1.bak.log /bin/gzip /backup/$1.$DATE.tar if [ $? -eq 0 ] then echo "$1 $DATE backup successfully" &gt;&gt; /backup/$1.bak.log else echo "ERROR...

    Linux Shell常用技巧

    ### Linux Shell 常用技巧详解 在 Linux 系统中,Shell 是用户与操作系统交互的主要方式之一。本文将深入探讨几个常用的 Shell 技巧及其应用场景。 #### 1. 使用 `/dev/null` 和 `/dev/tty` 在 Linux 系统中,`/...

    Linux自动清理日志文件方法

    上述Cron表达式的含义是:每天凌晨1点执行`/opt/soft/bin/auto-del-30-days-ago-log.sh`脚本,其中`&gt; /dev/null 2&gt;&1`用于忽略脚本执行时产生的任何输出信息,确保不会发送邮件提醒。 通过这种方式,我们可以轻松...

    Linux——shell编程基础

    - 示例:`find / -name test &gt; /dev/null 2&gt;&1` 的含义是搜索根目录下的名为 "test" 的文件,并将输出重定向到空设备文件 `/dev/null`,同时将错误输出也重定向到同一位置。 #### 五、Shell 变量管理 - **变量...

    Shell执行/调用Java/Jar程序例子的实例详解

    if expr "$link" : '/.*' &gt; /dev/null; then PRG="$link" else PRG=`dirname "${PRG}"`/"$link" fi done BASEDIR=`dirname ${PRG}` BASEDIR=`cd ${BASEDIR}/..;pwd` if test -z ${JAVA_HOME}; then JAVA_BIN...

    daemontools控制脚本

    ps -ef | grep qmail | grep tcpserver | awk '{print $2}' | xargs kill &gt; /dev/null 2&gt;&1 killall qmail-send &gt; /dev/null 2&gt;&1 ``` 最后删除Qmail服务的锁文件。 ```sh if [-f /var/lock/subsys/qmail]; then ...

    详解linux下nohup日志输出过大问题解决方案

    例如,`nohup ./execute.sh &gt; /home/xxx/log.log 2&gt;&1 &`会将标准输出和标准错误都重定向到`/home/xxx/log.log`文件中,而不是默认的`nohup.out`。 针对日志文件过大问题,可以采取以下策略: 1. 定期分割日志:...

    Linux在批量服务器管理中实用的PS1命令提示符格式实现方法

    echo $eth1_IP | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" &gt; /dev/null 2&gt;&1 if [ $? -ne 0 ]; then echo 'eth1_IP is empty!' exit 1 fi # 设置PS1 echo "export PS1='\[\e[32m\][\u@$eth1_IP...

    DD-WRT移动随e行WLAN自动登录脚本

    wget http://hi.baidu.com/myeyre/blog/item/bb5470cfa42c2637f9dc613b.html -O /dev/null &gt; /tmp/root/keepalive.log 2&gt;&1 &` - **自动重新登录任务**:每隔6小时执行一次,以确保连接有效。 - 命令格式:`0 */6...

    centos上通过sh文件启动jar等程序与命令详解.zip

    java -jar your-jar-file.jar &gt; logs/app.log 2&gt;&1 & ``` 6. **检查运行状态**:使用`pgrep`或`jps`命令查找特定jar的进程ID,确认应用程序是否正在运行。 7. **停止程序**:可以创建一个函数或单独的命令来杀死...

    LINUX_SHELL

    ### Linux Shell 编程知识点详解 #### 综述篇 **Shell是什么** - **定义**:Shell 是一种特殊的程序,充当用户与 Linux 或 Unix 操作系统内核之间的接口。它接收用户的输入,并将这些指令传递给操作系统的核心...

    Linux系统下mysqlcheck修复数据库命令(详解)

    这里的`&gt; /dev/null 2&gt;&1`是为了避免输出到控制台,而是将其丢弃。 总的来说,`mysqlcheck`是MySQL数据库管理员的得力助手,通过它可以有效地管理和维护数据库健康状态,确保数据的完整性和系统的稳定运行。了解并...

    pyenv安装的使用例子

    if command -v pyenv 1&gt;/dev/null 2&gt;&1; then eval "$(pyenv init -)" fi ``` 保存并关闭文件,然后运行`source ~/.bash_profile`或`source ~/.zshrc`使更改生效。 在Windows中,`pyenv-win`会在安装过程中自动...

    linux常用shell脚本

    00 8-18/1 * * * cut -f1 /xyz/x1 &gt;&gt; /backup/bak01.txt ``` **示例3:** 每天5:50对`/data`目录进行压缩备份。 **脚本内容:** ```bash 50 5 * * * tar zcvf backup.tar.gz /data ``` **示例4:** 每天5:55卸载CD...

    超级运维的109个shell脚本合集

    - `mysqldump -h$HOST -u$USER -p$PASS -B $DB &gt; $BACKUP_NAME 2&gt;/dev/null`:备份单个数据库到指定文件,忽略错误输出。 #### 多循环备份 - **脚本功能**:分别备份MySQL数据库中的每个数据库及其所有表到单独的...

Global site tag (gtag.js) - Google Analytics