标准文件描述符
Linux 操作系统为进程保留了3个特殊的文件描述符,这些文件描述符是标准的输入输出描述符,各个文件描述符的意义如下:
文件描述符值 | 标准文件名 | 含义 |
---|
0 | stdin | 标准输入文件,代表键盘 | 1 | stdout | 标准输出文件,代表显示器 | 2 | stderr | 标准错误输出文件,代表显示器 |
stdin、stdout、stderr 默认在进程启动时就打开了,0、1、2 这三个文件描述符可以直接在进程中使用。?
由于这些标准的输入输出都是以文件的方式操作的,因此,可以将以上这些文件重定向到硬盘上的文件中,或者重定向到管道中。
可以将输出重定向到非显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。Bash 支持的输出重定向符号如下表所示。
命令行重定向格式?
在输出重定向中,“>”? 代表的是覆盖,“>>”? 代表的是追加。?
令格式 | 含义 | 说明 |
---|
command?>file | 标准输出覆盖 | 以覆盖的方式,把 command 的正确输出结果输出到 file?文件中。 | command >>file | 标准输出追加 | 以追加的方式,把 command 的正确输出结果输出到 file?文件中。 | command 2>file | 错误输出覆盖 | 以覆盖的方式,把 command 的错误信息输出到 file?文件中。 | command 2>>file | 错误输出追加 | 以追加的方式,把 command?的错误信息输出到 file?文件中。 | command >file?2>&1 | 将标准输出与错误覆盖到同一文件 | 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。file 将以覆盖方式打开。 | command >>file?2>&1 | 将标准输出与错误追加到同一文件 | 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。file 将以追加方式打开。 | command >file1 2>file2 | 覆盖到不同文件 | 以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | command >>file1? 2>>file2 | 追加到不同文件 | 以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。 | command >file 2>file | 慎用的做法 | 这两种写法会导致 file 被打开两次,引起资源竞争,所以 stdout 和 stderr 会互相覆盖 | command >>file 2>>file | 慎用的做法 | 这两种写法会导致 file 被打开两次,引起资源竞争,所以 stdout 和 stderr 会互相覆盖 |
注意
输出重定向的完整写法其实是fd>file 或者fd>>file ,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。
当文件描述符为 1 时,一般都省略不写,如上表所示;当然,如果你愿意,也可以将command >file 写作command 1>file ,但这样做是多此一举。
当文件描述符为大于 1 的值时,比如 2,就必须写上。
需要重点注意的是:
fd 和> 之间不能有空格,否则 Shell 会解析失败;
> 和file 之间的空格可有可无。 为了保持一致,建议在> 两边都不加空格。?
例如:如下命令行语句是错误 的:
echo "I am a cat" 1 >log.txt
错误原因是:1 和> 之间的空格。echo 命令的输出结果是 I am a cat,我们的初衷是将输出结果重定向到 log.txt,但是当你打开 log.txt 文件后,发现文件的内容为I am a cat 1 ,这就是多余的空格导致的解析错误。也就是说,Shell 将该条语句理解成了下面的形式:?
echo "I am a cat" 1 1>log.txt
|