zoukankan      html  css  js  c++  java
  • shell重定向(大于号,小于号,左右,2>&1,&)

    本文的例子部分是引用网络上的一篇文章。


    Linux的IO输入输出有三类

    Standard Input 代码 0
    Standard Output 代码 1
    Standard Error 代码 2

    举个例子:ls test.sh test1.sh >success.txt 2>&1

    将前面执行结果的标准输出流写入success.txt文件,省略了1,全句为:ls test.sh test1.sh 1>success.txt 2>&1。

    错误输出用2,如2>error.txt。用&1表示类似1,和1绑定到一起,输出到一个文件,用&表示绑定在一起。而“&-”表示关闭。

    但注意,

    command > file 2>file 与command > file 2>&1 是不同的:


    command > file 2>file :是将命令所产生的标准输出信息stdout和错误的输出信息stderr送到file中,但这样会导致file会被打开两次,所以stdout和stderr会互相覆盖。实际上FD1和FD2同时使用file,引起资源竞争。
    而command >file 2>&1:将stdout直接送向file,而stderr是继承FD1管道后被送往file,所以file 只被打开一次,stdout和stderr共用FD1一个管道。实际相当于stderr合并到stdout后一起输出到file中。
    从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法.


    1. 标准输入,标准输出与标准错误输出 

    标准输入:从键盘输入,即从键盘读入数据。

    标准输出:把数据输出到终端上。

    标准错误输出:把标准错误输出到终端上。

    默认的标准输入指的是键盘,默认的标准输出与标准错误输出是屏幕或者是终端。

    系统为这三个文件分配了文件标识符fd(file descripter).分别为0,1,2.

    在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。

    2. 重定向

    重定向分为输入重定向与输出重定向。

    "<"表示输入重定向

    ">"表示输出重定向
    所谓的输入重定向即输入不从键盘读入,而是从文件输入或其它。

    所谓的输出重定向即不输出到终端上,而是输出到文件中去或其它。


    "<<"代表当前标准输入来自命令行的一对分隔号的中间内容。

    用">"输出时,如果文件不存在会自动建立一个文件,如果第二次输入时,会覆盖前一次的输入内容,

    而">>"输出,表示追加到文件中,不覆盖。当前输出内容会追加到指定文件的尾部。

    如:

    python historical_report.py 2014 06 age | >log_sex_age.txt 2>&1

    python historical_report.py 2014 06 age | >>log_sex_age.txt 2>&1

    这里注意“|”两边的空格可有可无。>会覆盖原文件,>>只追加到文件尾。


    3. 下面看一下几个例子

    (1)输入重定向

    [root@localhost ~]# wc</etc/inittab
    53 229 1666

    wc统计行数,单词数, 字符数

    其中wc的输入来自 /etc/inittab


    [root@localhost ~]# wc <<aa
    > 1
    > 11
    > 111
    > aa
    3 3 9

    wc统计分隔符aa之间的内容。

    (2)输出重定向

    [root@localhost ~]# ps -ef >a.txt //把进程的信息输出重定向到a.txt文件中去

    [root@localhost ~]# ps -ef> >a.txt //进程信息追加到a.txt的文件中去

    其实,所谓的输入输出重定向就是不从键盘输入和屏输出。

    4. Linux下输出重定向的典型分析

    (1) a.out > outfile 2>&1
    (2) a.out 2> &1 >outfile

    分析:

    0代表标准输入,1代表标准输出,2代表标准错误输出。其中1(即>=1>)可省略,默认为标准输出。所以输出一般省略1,如cat "test" 1>log 2>eorr ,简写成,cat "test" >log 2>eorr。

    (1)首先把a.out重定向到outfile中。然后 2>&1把标准错误输出重定向和1一样的文件中去。相当于把标准输出与标准错误输出都一起重定向到outfile中去。 &1代表的是标准输出的文件描述符。1一般放在左边表示标准输出重定向到什么位置,而1放在右边是重定向到标准输出中,所以用&区分一下,表示标准输出的文件描述符。2>1表示把标准错误重定向到文件1中去,2>&1则表示标准错误重定向到标准输出中去。

    (2)首先把标准错误输出重定向到标准输出中,此时标准输出还在终端。因此标准错误也在终端。然后标准输出到outfile中去了。而标准错误还是在终端。

    因此,(1)表示标准输出与标准错误都到outfile中去了。

    (2)表示标准输出到outfile,但标准错误输出仍然在终端。

    ls 1>/dev/null 2>/dev/null

    ls >/dev/null 2>&1

    /dev/null是一个垃圾箱,是一个无底洞,表示的含义为不显示。

    即标准输出与标准错误输出不显示。

    以上两个命令表示的含义是相同的。

    另外,&>表示全部重定向:ls thereisno &> out.txt 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)

  • 相关阅读:
    ubuntu 安装 redis desktop manager
    ubuntu 升级内核
    Ubuntu 内核升级,导致无法正常启动
    spring mvc 上传文件,但是接收到文件后发现文件变大,且文件打不开(multipartfile)
    angular5 open modal
    POJ 1426 Find the Multiple(二维DP)
    POJ 3093 Margritas
    POJ 3260 The Fewest Coins
    POJ 1837 Balance(二维DP)
    POJ 1337 A Lazy Worker
  • 原文地址:https://www.cnblogs.com/lidabo/p/15662823.html
Copyright © 2011-2022 走看看