重定向¶
形如 ls > out.txt 会将 ls 命令的标准输出(stdout)重定向到 out.txt 文件中,具体地说,会将 out.txt 关联到程序的标准输出,然后再运行相应的命令。类似的,ls >> out.txt 会将输出追加(而不是覆盖)到 out.txt 文件,cat < in.txt 会将程序的标准输入(stdin)重定向到文件 in.txt。
请为你的 shell 程序实现 >、>> 和 < 的功能。你可能要用到的函数:open、close、dup 等。
样例:
$ ls | cat -n | grep 1 > out
$ cat out
     1  Cargo.lock
$ cat < out
     1  Cargo.lock
$ ls | cat -n | grep 5 >> out
$ cat out
     1  Cargo.lock
     5  target
边界情况说明:
- 你不需要考虑含有内建命令的重定向;
 - 你不需要考虑 
stderr的重定向; - 你可以认为重定向符号的两边总是各有至少一个空格字符。
 
支持基于文件描述符的文件重定向、文件重定向组合(选做)¶
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):文件描述符为 0,Unix/Linux 程序默认从 stdin 读取数据;
 - 标准输出文件(stdout):文件描述符为 1,Unix/Linux 程序默认向 stdout 输出数据;
 - 标准错误文件(stderr):文件描述符为 2,Unix/Linux 程序会向 stderr 流中写入错误信息。
 
我们可以手动更改输入输出的文件描述符。请自行查找资料,实现以下这些文件重定向:
- 形如 
cmd 10> out.txt和cmd 20< in.txt这样的命令会将打开文件描述符 10 和 20 并重定向到相应的文件; cmd <<< text会将"text\n"作为标准输入重定向给cmd;- 以下命令会将字符串 
"this\noutput\n"作为标准输入重定向给cmd: 
cmd << EOF
this
output
EOF
| 要求 | 满分 | 
|---|---|
支持 > 重定向 | 
5% | 
支持 < 重定向 | 
5% | 
支持 >> 重定向 | 
5% | 
| 「可选」 支持数字文件描述符 | 5% | 
| 「可选」 支持文本重定向 | 5% | 
| 「可选」 支持 EOF 重定向 | 5% |