I/O 重定向
每一个应用程序都有三个标准文件描述符:0、1、2。
- 0 代表标准输入,即 scanf、getc 等函数读取的文件;
- 1 代表标准输出,即 printf、putc 等函数写入的文件;
- 2 代表标准错误,即 perror 等函数写入的文件。
默认情况下,ttinyShell 将使用当前终端设备作为标准文件,ttinyShell 创建出的进程将继承 ttinyShell 标准文件设置。ttinyShell 中可以使用重定向语句将标准文件重定向为其他文件,也只有标准文件可被重定向。
重定向设置方法如下:
>file
,1>file
形式用于将标准输出重定向到某文件,以覆盖方式输出。如果文件不存在,会自动创建文件。[root@sylixos:/root]# echo $PATH /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH >/apps/test/path [root@sylixos:/root]# ll /apps/test/ -rw-r--r-- root root Mon Jul 31 16:41:08 2023 50 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH >/apps/test/path [root@sylixos:/root]# ll /apps/test/ -rw-r--r-- root root Mon Jul 31 16:41:08 2023 50 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# [root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH 1>/apps/test/path [root@sylixos:/root]# ll /apps/test/ -rw-r--r-- root root Mon Jul 31 16:43:16 2023 50 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH 1>/apps/test/path [root@sylixos:/root]# ll /apps/test/ -rw-r--r-- root root Mon Jul 31 16:43:16 2023 50 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
2>file
形式用于将标准错误重定向到某文件,以覆盖方式输出。如果文件不存在,会自动创建文件。[root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH 2 >/apps/test/path [root@sylixos:/root]# ll /apps/test/path -rw-r--r-- root root Mon Jul 31 16:47:26 2023 52 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin 2 [root@sylixos:/root]# echo $PATH 2 >/apps/test/path [root@sylixos:/root]# ll /apps/test/path -rw-r--r-- root root Mon Jul 31 16:47:26 2023 52 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin 2 [root@sylixos:/root]#
&>file
形式用于将标准输出和标准错误重定向到某文件,以覆盖方式输出。[root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH &>/apps/test/path [root@sylixos:/root]# ll /apps/test/ -rw-r--r-- root root Mon Jul 31 16:57:47 2023 50 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH &>/apps/test/path [root@sylixos:/root]# ll /apps/test/ -rw-r--r-- root root Mon Jul 31 16:57:47 2023 50 B, path total items: 1 [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
>>file
,1>>file
形式用于将标准输出重定向到某文件,以追加方式输出。[root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH >>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH >>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# [root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH 1>>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH 1>>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
2>>file
符号用于将标准错误重定向到某文件,以追加方式输出。[root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH 2>>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH 2>>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
&>>file
符号用于将将标准输出和标准错误重定向到某文件,以追加方式输出。[root@sylixos:/root]# rm /apps/test/path [root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH &>>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]# echo $PATH &>>/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
重定向语句不能单独使用要配合其他基本命令才可以,且要放到命令的最后面,和基本命令内容有空格隔开。
重定向语句内部“>”或“<”符号左右不能有空格,但重定向语句整体和其他参数要有空格隔开。
[root@sylixos:/root]# ll /apps/test/ total items: 0 [root@sylixos:/root]# echo $PATH > /apps/test/path can not process redirect. [root@sylixos:/root]# echo $PATH > /apps/test/path can not process redirect. [root@sylixos:/root]# echo $PATH >/apps/test/path [root@sylixos:/root]# cat /apps/test/path /usr/bin:/bin:/usr/pkg/sbin:/sbin:/usr/local/bin [root@sylixos:/root]#
重定向语句部分不属于基本命令的参数部分,不会被基本命令解析,是 Shell 实现的特殊处理。如果重定向语句后面还有其他参数,都会被忽略。
[root@sylixos:/root]# args 123 456 >test [root@sylixos:/root]# cat test arg 1 is args arg 2 is 123 arg 3 is 456 [root@sylixos:/root]# args 123 456 >test 789 [root@sylixos:/root]# cat test arg 1 is args arg 2 is 123 arg 3 is 456 [root@sylixos:/root]# args 123 456 0<test arg 1 is args arg 2 is 123 arg 3 is 456 [root@sylixos:/root]#
多个重定向语句同时使用时,只有最后一句有效。其他语句也会创建文件,但内容为空。
[root@sylixos:/root]# echo abc >test1 >test2 >test3 [root@sylixos:/root]# ll -rw-r--r-- root root Thu May 18 14:17:39 2023 5 B, test3 -rw-r--r-- root root Thu May 18 14:17:39 2023 0 B, test2 -rw-r--r-- root root Thu May 18 14:17:39 2023 0 B, test1 total items: 3 [root@sylixos:/root]# cat test3 abc [root@sylixos:/root]# echo abc >test3 >test2 >test1 [root@sylixos:/root]# ll -rw-r--r-- root root Thu May 18 14:18:10 2023 0 B, test3 -rw-r--r-- root root Thu May 18 14:18:10 2023 0 B, test2 -rw-r--r-- root root Thu May 18 14:18:10 2023 5 B, test1 total items: 3 [root@sylixos:/root]# cat test1 abc [root@sylixos:/root]#