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

预备知识

文件描述符( 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 命令学习 - 标准输入输出重定向)