当我们使用shell执行命令、或者执行C语言程序,每个进程会默认打开三个文件,并使用文件描述符来引用这些文件。
1.1 Linux标准文件描述符
文件描述符 | 缩写 | 描述 |
0 | STDIN | 标准输入 |
1 | STDOUT | 标准输出 |
2 | STDERR | 标准错误输出 |
- 什么时候会用到标准错误?
- 什么时候会用标准输出?
1.2 文件重定向
在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。
在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。
- 符号:>表示覆盖 >>表示追加
1.2.1重定向输出
标准输出的文件描述符是1,默认是重定向到屏幕。
- 示例1: 标准输出重定向
# ls >log.txt //将ls输出的内容重定向到log.txt文件,屏幕上不会显示信息 //错误信息不会输出到log.txt,还是输出到屏幕上 [root@wbyq test]# ls 66 >log.txt ls: 无法访问66: 没有那个文件或目录 |
- 示例2:创建长度为0的文件
# >123.c |
- 示例3: C语言程序
#include <stdio.h> int main() { printf("hello world!\n"); return 0; } [root@wbyq test]# ./a.out >log.txt //编译上面程序,运行可执行文件时,将标准输出重定向到log.txt |
1.2.2 标准错误
标准错误的文件描述符是2,默认重定向到屏幕。
为了重定向标准错误,可以指定文件描述符2
- 示例1: 默认错误信息是输出到屏幕上的,重定向之后可以输出到文件
[root@wbyq test]# ls 666.c ls: 无法访问666.c: 没有那个文件或目录 [root@wbyq test]# ls 666.c 2> log.txt [root@wbyq test]# |
- 示例2: C语言程序
#include <stdio.h> int main() { perror("hello world!"); //输出错误信息 return -1; } # ./a.out 2>log.txt //错误重定向到log.txt |
如果不需要错误信息,可以将错误信息重定向到/dev/null文件,该文件相当于系统的垃圾箱。
# ./a.out 2>/dev/null //错误重定向到/dev/null
1.2.3 标准输入
标准输入的文件描述符是0,默认从重定向到键盘。
- 示例1: 从键盘读取读取到123.c ,遇到A字母就结束读取。 cat命令再将读取到的数据写入到123.c
[root@wbyq test]# cat >123.c<<A > 123 > 456 > 789 > A [root@wbyq test]# cat 123.c 123 456 789 |
- 示例2:
[root@wbyq test]# cat <<A //遇到A字母结束读取 > 12 > 34 > 45 > A 12 34 45 |
- 示例3: 从键盘输入数据排序
sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
[root@wbyq test]# sort >>log.txt<<A > 67 > 34 > 68 > 34 > 56 > A [root@wbyq test]# cat log.txt 34 34 56 67 68 |
示例3:
# sort 123.c //顺序输出文件内容 |
1.2.4 重定向合并
示例1: //将ls的标准错误与标准输出一追加的方式重定向到log.txt文件
# ls >> log.txt 2>&1 |
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1,即和1重定向的文件系统上的位置是一样的
示例2:
command < filename >filename2 把文件filename中的内容作为command的输入,把标准输出重定向到filename2文件中 command 0< filename 1> filename2 同上 |