zoukankan      html  css  js  c++  java
  • Linux 里的 2>&1含义

    我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令。首先我们把这条命令大概分解下:

    首先就是一个nohup:表示当前用户和系统的会话下的进程忽略响应HUP消息。
    &是把该命令以后台的job的形式运行。
    command>/dev/null较好理解,/dev/null表示一个空设备,就是说把 command 的执行结果重定向到空设备中,说白了就是不显示任何信息。

    一、2>&1是什么含义?

    几个基本符号及其含义:

    • /dev/null 表示空设备文件;
    • 0 表示stdin标准输入;
    • 1 表示stdout标准输出;
    • 2 表示stderr标准错误

    1、command>/dev/null

    command>/dev/null其实该命令是一个缩写版,对于一个重定向命令,形式肯定是command >xx.txt,那么到底哪里有省略??

      command > /dev/null相当于执行了command 1 > /dev/null。执行 command 产生了标准输出 stdout(用1表示),重定向到/dev/null的设备文件中。

    2、2>&1

    通过上面command > /dev/null等价于command 1 > /dev/null,那么对于2>&1也就好理解了,2就是标准错误,1是标准输出,那么这条命令不就是相当于把标准错误重定向到标准输出

    3、2>12>&1的写法有什么区别:

    2>1的作用是把标准错误的输出重定向到1,但这个1不是标准输出,而是一个文件!!!,文件名就是1;

    2>&1的作用是把标准错误的输出重定向到标准输出1,&指示不要把1当作普通文件,而是fd=1即标准输出来处理。

    4、command>a 2>a 与 command>a 2>&1的区别

    通过上面的分析,对于command>a 2>&1这条命令,等价于command 1>a 2>&1可以理解为执行 command 产生的标准输出重定向到文件 a 中,标准错误也重定向到文件 a 中。那么是否就说command 1>a 2>&1等价于command 1>a 2>a呢。其实不是,command 1>a 2>&1与command 1>a 2>a还是有区别的,区别就在于前者只打开一次文件a,后者会打开文件两次,并导致 stdout 被 stderr 覆盖。&1的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的 a。从IO效率上来讲,command 1>a 2>&1比command 1>a 2>a的效率更高

    5、为何2>&1要写在后面么?

    index.php task testOne >/dev/null 2>&1

    我们可以理解为,左边是标准输出,好,现在标准输出直接输入到/dev/null中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。

    可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件

    可以用:
    ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
    ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
    ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
    ls xxx >out.txt 2>&1,实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了

    6、tips

    为何2>&1要写在 command>1 的后面,直接用2可以么。比如ls 2>a。其实这种用法也是可以的,ls 命令列出当前的目录,用stdout(1)表示,由于这个时候没有stderr(2),这个时候执行ls 2>a也会正常产生一个 a 的文件,但是 a 的文件中是空的,因为这时候执行ls并没有产生stderr(2)。


    参考来源:https://blog.csdn.net/liupeifeng3514/article/details/79711694

  • 相关阅读:
    吐血分享:QQ群霸屏技术教程2017(活跃篇)
    吐血分享:QQ群霸屏技术(初级篇)
    吐血分享:QQ群霸屏技术教程2017(效益篇)
    吐血分享:QQ群霸屏技术教程(接单篇)
    吐血分享:QQ群霸屏技术教程2017(问题篇)
    吐血分享:QQ群霸屏技术教程(利润篇)
    吐血分享:QQ群霸屏技术教程2017(维护篇)
    用C#实现WEB代理服务器
    Linux基础命令---tload显示系统负载
    Linux基础命令---iostat显示设备状态
  • 原文地址:https://www.cnblogs.com/clarenceyang/p/9837352.html
Copyright © 2011-2022 走看看