预备知识
文件描述符( File Descriptor )
在Unix 系统中文件描述符是用于访问文件、输入输出、管道、网络套接字的一个抽象概念[3]。文件描述符是一个非负的正整数,每一个Unix进程中都会有三个与标准流所对应的的POSIX文件描述符,分别为:
-
stdin
- 标准输入,提供给应用的标准输入。文件描述符为0。 -
stdout
- 标准输出,程序的输出,在非重定向的情况下为终端。文件描述符为1。 -
stderr
- 标准错误输出,程序的错误输出。文件描述符为2。
关于文件描述符的详细,见文章{% post_link file_descriptor_101 文件描述符101 %}
输出重定向
有两种方式可以将输出重定向:
n> file
将文件描述符n重定向到文件file中,如果文件不存在则会创建文件,如果存在的话将会覆盖原有内容。n>> file
将文件描述符n重定向到文件file中,如果文件不存在将会创建文件,如果存在则会在文件的结尾开始写入输出。
如果我们没有指定文件描述符,则默认为1,即标准输出。
重定向到不同的文件
我们可以把stdout
和stderr
输出到不同的文件,例子:
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
重定向到一个文件
很多情况下我们需要将stdout
和stderr
输出到同一个文件中,这个时候我们可以使用 &>
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文件清空。