发布新日志

  • 关于>&2、2>&1等重定向的详细解释

    2010-11-16 16:31:01

    关于>&2、2>&1等重定向的详细解释

    在POSIX shell中,命令的结果可以通过%>;的形式来定义(其中%表示文件描 述符:1为标准输出stdout、2为标准错误stderr)!系统默认% 值是1,也就是1>;,而1>;可以简写为>;,也就是默认为>;。而stdout的默认目标是终端(这点不用验证吧)。另 外,stderr的默认目标我个人认为也是终端,比如:
    #abcddcba
    sh: abcddcba: not found.
    错误信息显示在终端上(对于telnet、dtterm等,那就说虚拟终端了)。

    ==============实验环境==============
    #mkdir redtest
    #cd redtest
    #mkdir a4
    #touch a1 a2 a3

    ==============简单试验==============
    #ls >;redout.lst (等同于ls 1>;redout.lst,标准输出重定向)
    系统先执行>;redout.lst,生成一个空文件,然后系统执行ls,再把结果重定向到redout.lst。这时在终端看不到任何信息,但是#more redout.lst可以看到a1、a2、a3、a4和redout.lst。
    #./ourgame 2>;rederr.lst (标准错误重定向)
    因为系统找不到执行脚本ourgame,产生错误,但并不是显示在终端上,而是把错误信息重定向到了rederr.lst。
    #more rederr.lst
    sh: ourgame: not found.
    ==============组合试验==============
    #rm rederr.lst
    #rm redout.lst
    #vi conj
    #!/usr/bin/sh
    #Email:webmaster@myhpux.com
    for FN in `ls`
    do
    if [[ -f $FN ]]
    then
    echo $FN
    else
    cp $FN $FN.new
    fi
    done
    //conj的作用是执行以后产生标准输出(echo)和标准错误(cp)
    #chmod 755 conj
    看看一下命令的结果:
    #./conj
    a1 //stdout
    a2 //stdout
    a3 //stdout
    cp: a4: is a directory. Need "-R" option.//stderr
    conj //stdout
    再试试重定向的结果:
    (1)、输出重定向到文件a1,终端上只能看到标准错误:
    #./conj >a1
    #./conj 1>a1
    #more a1
    a1
    a2
    a3
    conj
    (2)、错误重定向到文件a1,终端上只能看到标准输出:
    #./conj 2>a1
    #more a1
    cp: a4: is a directory. Need "-R" option.
    (3)、把标准输出和标准错误都重定向到a1,终端上看不到任何信息:
    #./conf >a1 2>&1 (等同于#./conf 1>a1 2>&1)
    #more a1
    a1
    a2
    a3
    cp: a4: is a directory. Need "-R" option.
    conj
    //其中&的意思,可以看成是“The same as”、“与...一样”的意思。本例中就是2>;和1>;一样,都输出到a1中。
    再看一个例子:
    #./conj 2>&1 >a1
    同样可以解释为2>和1>一样,但是这时1>是系统默认输出到终端,所以标准错误也输出到终端;然后,系统把标准输出重定向到文件a1。

    记得unixpianpianMM有个问题:
    echo "Usage $0 -d" >&2
    那么可以解释为echo "Usage $0 -d" 1>&2
    也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件。

    以上脚本在HP-UX11.00 L2000通过!所有定义、名词均建立在本人的实践和本人所了解的知识上,如有错误,请指正,谢谢!!!

    Bourne和Korn shell中的重定向
    从文件输入                                              <file or 0<file
    将标准输出重定向为文件                                    >file or 1>file
    将标准错误重定向为文件                                    2>file
    将标准输出追加到文件                                      >>file
    将标准错误重定向为标准输入                                 2>&1
    将第一个命令的输入作为第二个文件的输入                       cmd1|cmd2
    将第一个文件即作为标准输入也作为标准输出                     <>file
    关闭标准输入                                              0<&-
    关闭标准输出                                              1>&-
    关闭标准错误                                              2>&-

    重定向小结
    脚本语言, 读书笔记 June 16th, 2008

    重定向是一个很有趣的话题,重定向这项技术减轻了程序编写者的负担,因为他只需要默认操作标准输入输出即可,而实际的标准输入可能是一个文本文件,而这一步的替换由shell来实现,不需要我们来操心,对程序来说是透明的。

    这里的命令默认都是在bash下,如果你使用的是其他的比如csh,那么请查阅相关的手册或资料。

    先来挑战一下你的理解能力,在你第一眼看到下面这行的时候你知道它在干嘛吗?



    outout-cmd 3>&1 1>&2 2>&3 3>&- | mail yourname
    这是一个取自”Unix Power Tools”的例子,这个的功能先按下不表,先来讲讲重定向的一些基本规则。

    重定向的位置可以写在命令的前面或者后面,要知道这样$ > output-file ls也是合法的哦。当然了,程序是用来给人读的,给人理解的,所以我们还是应该按照一般的写法,将这种重定向写到后面去。而bash处理重定向的顺序是从 左到右的,为什么要在这里特别提一下呢?因为顺序不同,可能引起的效果也截然不同,这里是我原来的一个例子。
    在重定向符号的前面我们可以任意的加上我们需要重定向的数字,一般的重定向标准输入我们使用的是 < input-file,而我们也可以在这里使用 3< input-file,这样的效果就是我们将该程序的3这个文件描述符重定向成了这个输入的文件。下面的这个程序可以作为一个简单的演示。

    int main()
    {
            char buf[10];
            size_t size;

            while ((size = read(3, buf, 10)) > 0) {
                    write(1, buf, size);
            }
            return 0;
    }
    然后再shell下敲入./a.out 3< input-file,那么读入的就是这个文件,并将该文件打印出来,很没劲的一个演示,不是吗?但是它却说明了一些道理,那就足够了。

    有时候我们希望同时重定向标准输出和标准错误输出,可以采用&>word和>&word的方法,这两种方法中比较推荐的是前者,至于为什么推荐,笔者尚不明朗。这两者等同于>word 2>&1的功能。

    >> 表示文件内容追加在文件的结尾


    [root@lebwork ~]#  cat test.txt >> abc.txt
    把test.txt的内容追加在abc.txt文件的尾部
Open Toolbar