Linux shell(比如 Bash)接收或发送序列和字符串流 形式的输入或输出。每个字符都独立于与之相邻的字符。字符没有被组织成结构化记录或固定大小的块。不管实际的字符串流进入或来自文件、键盘、显示窗口或其他 I/O 设备,都使用文件 I/O 技术来访问流。Linux shell 使用 3 种标准的 I/O 流,每种流都与一个文件描述符相关联:
stdout 是标准输出流,它显示来自命令的输出。它的文件描述符为 1。 stderr 是标准错误流,它显示来自命令的错误输出。它的文件描述符为 2。 stdin 是标准输入流,它为命令提供输入。它的文件描述符为 0。输入流通常通过终端击键为程序提供输入。输出流通常向终端输出文本字符。最初的终端是 ASCII 打字机或显示终端,但现在更多是指图形桌面上的文本窗口。
如果您已经学习了文章 “学习 Linux,101:文本流和过滤器 ” ,那么就熟悉本文的部分内容。
可以通过两种方法将输出重定向到文件:
n> 将输出从文件描述符 n 重定向到文件。您必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。 n>> 还可以将输出从文件描述符 n 重定向到一个文件中。这里也一样要求您具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,输出将附加到现有的内容后面。在 n> 或 n>> 中的 n 引用文件描述符。如果省略它,将执行标准输出。清单 3 在我们先前在 lpi103-4 目录中创建的文件中使用重定向将标准输出和标准错误从 ls 命令分离出来。我们还显示将输出附加到现有文件中。
清单 3. 输出重定向
[ian@echidna lpi103-4]$ ls x* z* ls: cannot access z*: No such file or directory xaa xab [ian@echidna lpi103-4]$ ls x* z* >stdout.txt 2>stderr.txt [ian@echidna lpi103-4]$ ls w* y* ls: cannot access w*: No such file or directory yaa yab [ian@echidna lpi103-4]$ ls w* y* >>stdout.txt 2>>stderr.txt [ian@echidna lpi103-4]$ cat stdout.txt xaa xab yaa yab [ian@echidna lpi103-4]$ cat stderr.txt ls: cannot access z*: No such file or directory ls: cannot access w*: No such file or directory
使用 n> 的输出重定向通常覆盖现有的文件。您可以使用 set 内置控件的 noclobber 选项对此进行控制。如果该选项已经设置,您可以使用 n>| 覆盖它,如清单 4 所示。