zoukankan      html  css  js  c++  java
  • linux 2>&1 和 &的意思

    先上代码

    $ command > file 2>&1 
    $ command >> file 2>&1
    

    这里的&没有固定的意思
    放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下:

    1 -> stdout
    2 -> stderr
    0 -> stdin
    

    换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射
    而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于

    >file 2>&1
    

    此处&>或者>&视作整体,分开没有单独的含义
    顺序问题:

    find /etc -name .bashrc > list 2>&1
    # 我想问为什么不能调下顺序,比如这样
    find /etc -name .bashrc 2>&1 > list
    

    这个是从左到右有顺序的
    第一种

    xxx > list 2>&1
    

    先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list
    第二种

    xxx 2>&1 > list
    

    先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响

    对于上面 '2>&1',举个例子,比如说:

    $ find /etc -names "*.txt"  >list 2>&1
    

    从左往右执行,执行到 >list,此时的 stdout 为 list;而执行到 2>&1,表示 stderr 重定向到 stdout,这里也就是 list 文件。
    因为 [ find /etc -names "*.txt" ] 这条命令是错误的( -names 应该是 -name)。
    本来要输出到终端屏幕的错误信息:

    find: unknown predicate `-names`
    

    被重定向到了 stdout 也就是 list 文件中,所以屏幕不会出现错误信息,而是打印到了 list 文件中。
    cat list 可以查看到 find: unknown predicate `-names' 就在里面。
    更粗暴的理解:
    试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
    换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出;

    最后一个& , 是让该命令在后台执行。

     先上代码

    $ command > file 2>&1 
    $ command >> file 2>&1
    

    这里的&没有固定的意思
    放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下:

    1 -> stdout
    2 -> stderr
    0 -> stdin
    

    换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射
    而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于

    >file 2>&1
    

    此处&>或者>&视作整体,分开没有单独的含义
    顺序问题:

    find /etc -name .bashrc > list 2>&1
    # 我想问为什么不能调下顺序,比如这样
    find /etc -name .bashrc 2>&1 > list
    

    这个是从左到右有顺序的
    第一种

    xxx > list 2>&1
    

    先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list
    第二种

    xxx 2>&1 > list
    

    先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响

    对于上面 '2>&1',举个例子,比如说:

    $ find /etc -names "*.txt"  >list 2>&1
    

    从左往右执行,执行到 >list,此时的 stdout 为 list;而执行到 2>&1,表示 stderr 重定向到 stdout,这里也就是 list 文件。
    因为 [ find /etc -names "*.txt" ] 这条命令是错误的( -names 应该是 -name)。
    本来要输出到终端屏幕的错误信息:

    find: unknown predicate `-names`
    

    被重定向到了 stdout 也就是 list 文件中,所以屏幕不会出现错误信息,而是打印到了 list 文件中。
    cat list 可以查看到 find: unknown predicate `-names' 就在里面。
    更粗暴的理解:
    试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
    换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出;

    最后一个"&", 是让该命令在后台执行。

  • 相关阅读:
    【BZOJ4890】[TJOI2017]城市(动态规划)
    【BZOJ4887】[TJOI2017]可乐(矩阵快速幂)
    【BZOJ4873】[六省联考2017]寿司餐厅(网络流)
    【BZOJ4868】[六省联考2017]期末考试(贪心)
    【Luogu3733】[HAOI2017]八纵八横(线性基,线段树分治)
    【Luogu3732】[HAOI2017]供给侧改革(Trie树)
    【Luogu3731】[HAOI2017]新型城市化(网络流,Tarjan)
    【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)
    28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?
    基础学习day07---面向对象三---继承,接口与 抽象类
  • 原文地址:https://www.cnblogs.com/x9mars/p/14964113.html
Copyright © 2011-2022 走看看