美文网首页Linux学习|Gentoo/Arch/FreeBSD
Mac 命令学习 - 标准输入输出重定向

Mac 命令学习 - 标准输入输出重定向

作者: 2power10 | 来源:发表于2016-06-03 22:21 被阅读0次

    预备知识

    文件描述符( File Descriptor )

    在Unix 系统中文件描述符是用于访问文件、输入输出、管道、网络套接字的一个抽象概念[3]。文件描述符是一个非负的正整数,每一个Unix进程中都会有三个与标准流所对应的的POSIX文件描述符,分别为:

    1. stdin - 标准输入,提供给应用的标准输入。文件描述符为0
    2. stdout - 标准输出,程序的输出,在非重定向的情况下为终端。文件描述符为1
    3. stderr - 标准错误输出,程序的错误输出。文件描述符为2

    关于文件描述符的详细,见文章{% post_link file_descriptor_101 文件描述符101 %}

    输出重定向

    有两种方式可以将输出重定向:

    • n> file
      将文件描述符n重定向到文件file中,如果文件不存在则会创建文件,如果存在的话将会覆盖原有内容。

    • n>> file
      将文件描述符n重定向到文件file中,如果文件不存在将会创建文件,如果存在则会在文件的结尾开始写入输出。

    如果我们没有指定文件描述符,则默认为1,即标准输出。

    重定向到不同的文件

    我们可以把stdoutstderr输出到不同的文件,例子:

    zhengyi$ ls
        file1 file2 file3
    zhengyi$ ls f* e* 1>out.txt 2>err.txt
    zhengyi$ cat out.txt 
        file1
        file2
        file3
    zhengyi$ cat err.txt 
        ls: e*: No such file or directory
    

    重定向到一个文件

    很多情况下我们需要将stdoutstderr输出到同一个文件中,这个时候我们可以使用 &> or &>>,它们会把标准输出和标准错误输出到一起。

    另外一种方法是利用m>&n,将某一个输出重定向到另一个输出中来。这个时候需要注意的是使用它们的顺序,比如下面这个例子:

    zhengyi$ ls f* z* 1>out.txt 2>&1
    zhengyi$ cat out.txt 
        ls: z*: No such file or directory
        file1
        file2
        file3
    zhengyi$ ls f* z* 2>&1 1>out.txt 
        ls: z*: No such file or directory
    zhengyi$ cat out.txt 
        file1
        file2
        file3
    

    ls f* z* 1>out.txt 2>&1这个例子是先将标准输出重定向到文件out.txt中,然后将标准错误重定向到标准输出中,这个是可以工作的。ls f* z* 2>&1 1>out.txt这个例子中,先将标准错误重定向到了标准输入,这个时候的标准输入指向的是默认的标准输入,而当后面将标准输入重定向到文件out.txt时,并不会改变标准错误的输出目标。

    忽略某一些输出

    比如说我们想要过滤输出中的错误,那么我们可以将标准错误输出到/dev/null中。

    zhengyi$ ls f* z*
        ls: z*: No such file or directory
        file1 file2 file3
    zhengyi$ ls f* z* 2>/dev/null 
        file1 file2 file3
    

    输入重定向

    与输出重定向相反,输入重定向是利用"<"符号来表达的。例子:

    zhengyi$ cat out.txt 
        err.txt
        file1
        file2
        file3
        out.txt
    zhengyi$ sort -r < out.txt 
        out.txt
        file3
        file2
        file1
        err.txt
    

    输出重定向可以和输入重定向组合起来一起使用,比如:

    zhengyi$ sort -r < out.txt > sorted.txt
    

    这个是将out.txt作为输入,然后把sort的结果重定向到sorted.txt中。同时使用输入和输出重定向的时候需要注意一点就是尽量避免使用同一个文件。比如说上面这个sort的例子,如果指向同一个文件,那么一开始输出重定向会先把out.txt文件清空。

    参考资料

    1. Learn Linux, 101: Streams, pipes, and redirects
    2. I/O Redirection
    3. Wikipedia - File Descriptor

    阅读原文

    相关文章

      网友评论

        本文标题:Mac 命令学习 - 标准输入输出重定向

        本文链接:https://www.haomeiwen.com/subject/jtrldttx.html