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

    文件描述符

    每个进程拥有自己的标准输入流、标准输出流、标准错误流。这几个标准流说起来很复杂,但其实都是文件。

    • 标准输入流(用 0 表示)可以作为进程执行的上下文(进程执行可以从输入流中获取数据)。
    • 标准输出流(用 1 表示)中写入的结果会被打印到屏幕上。
    • 如果进程在执行过程中发生异常,那么异常信息会被记录到标准错误流(用 2 表示)中。

    例子

    看一个例子,比如我们输入:

    ls1 > out

    结果并不会存入out文件,因为ls1指令是不存在的。结果会输出到标准错误流中,仍然在屏幕上。这里我们可以把标准错误流也重定向到标准输出流,然后再重定向到文件。

    ls1 &> out

    这个写法等价于:

    ls1 > out 2>&1

    2>&1的含义

    2>&1表明将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出),为什么1前面需要&?当没有&时,1会被认为是一个普通的文件,有&表示重定向的目标不是一个文件,而是一个文件描述符。

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

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

    command 2>&1 >file 
    2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

    测试

    ##测试不加&
    $ ls1 > out 2>1
    $ ls
    1  
    $ cat 1
    bash: ls1: command not found...
    
    ##测试2>&1放在中间
    $ ls1 2>&1 > out
    bash: ls1: command not found...
    
    ##测试2>&1放在结尾
    $ ls1 > out 2>&1
    $ ls
    1  out
    $ cat out
    bash: ls1: command not found...

    参考:

    知乎 - 如何理解Linux shell中的“2>&1”

  • 相关阅读:
    redux-plain-english-workflow
    github入门操作
    debian 安装 android studio 环境
    [转]Linux挂载点介绍及桌面服务器分区方案
    Debian 安装 vmware-tools 手记
    linux 查看进程 和 杀死进程
    extern "C"的用法解析
    TinyXML:一个优秀的C++ XML解析器
    g++ 编译c文件
    python 压缩 解压缩 文件
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/14211993.html
Copyright © 2011-2022 走看看