zoukankan      html  css  js  c++  java
  • 2>&1

    2>&1
    基本含义:
    0:stdin
    1:stdout
    2:stderr

    标准错误重定向到标准输出,&?
    &指等效于标准输出

    cmd>a 2>a 和 cmd>a 2>&1的区别
    cmd>a 2>a:产生的标准输入重定向到文件a,标准错误也重定向到a,会打开两次文件a,导致stdout会被stderr覆盖

    &1可以理解为标准输出的引用,这个引用就是stdout产生打开的a,从io效率来看比不带&的要高
    而cmd>a 2>&1:只打开1次文件a,在这一次打开的文件a中追加内容

    e.g.

    //test.sh
    #!/bin/sh
    t
    date
    

    执行bash test.sh>res1.log

    发现stderr没有被写入文件,而是被打印到屏幕
    所以bash test.sh > res1.log 等价于 bash test.sh 1>res1.log

    执行bash test.sh>res2.log 2>&1
    屏幕没有报错, stdout和stderr都被重定向到res2.log中

    command >out.file 2>&1 & //相当于ctrl - z
    command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

    试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
    换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出
    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了。
    为何2>&1要写在后面?

    为何2>&1要写在后面?
    command > file 2>&1
    首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

    tee command

    将命令输出内容写入文件,供后续参考
    从标准输入中复制到每一个文件,并输出到标准输出e.g. ping google.com | tee output.txt
    确保tee命令追加信息到文件中e.g. tee -a [file]
    让tee写入多个文件e.g. [command] | tee [file1] [file2]

    cmd_list.append('2>&1 | tee {}/log_import.txt'.format(self.log_output))

    2>&1:标准错误重定向到标准输出,即log文件也会记录运行错误产生的输出信息

  • 相关阅读:
    python--binascii--二进制和ASCII编码的二进制的转换
    python--you-get视频下载
    python--AES加密
    nodejs的简单爬虫
    golang学习之接口型函数
    golang学习之defer
    golang学习之slice基本操作
    微信小程序初体验
    vuex构建笔记本应用学习
    2016年终总结
  • 原文地址:https://www.cnblogs.com/sayiqiu/p/10676670.html
Copyright © 2011-2022 走看看