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”

  • 相关阅读:
    产品评价 商家回复倒三角形
    第二行字体 多余省略号显示
    Input 标签 安卓 与 IOS 出现圆角 显示
    iOS testflight 使用说明
    iOS滤镜功能
    cookie和session以及iOS cookie的查取
    微信小程序开发demo
    Charles(V3.10.1)的抓包以及常见功能的使用
    通知实战 设置通知图片(iOS10以后的)
    Xcode: Run Script 的运用, 使build打包后自动+1
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/14211993.html
Copyright © 2011-2022 走看看