跳转至

拓展功能参考

支持 History

在使用 shell(这里特指 bash)的时候输入 history n 可以显示最近执行的 n 条指令(对于 zsh 用户,history 命令会被自动替换为内建的 fc -l,显示从 n 条命令开始的记录)。同时我们可以使用 !n 重复执行历史记录中的第 n 条命令,用 !! 命令重复执行上一条命令。

例如:

$ history 3
  843  echo osh-2023
  844  echo osh
  845  history 3
$ !843
echo osh-2023
osh-2023
$ !!
echo osh-2023
osh-2023

请为你的 shell 实现对历史命令的处理,支持 !n!!history n 命令,且 history n 的输出请尽可能与 bash 相同。

要求 满分
「可选」支持 history 5%
「可选」通过上下方向键切换到不同的历史命令 5%

处理 CTRL-D (EOF) 按键

在使用 shell 的时候输入 exit 即可退出 shell,CTRL-D (EOF) 在这种场景下等同于 exit

提示

CTRL-D 并不会发送信号,而是输入一个特殊的 EOF 字符。

要求 满分
「可选」支持 CTRL-D 5%

Bash 风格的 TCP 重定向

在精简的 Linux 环境中(如 Docker 容器里),常常是没有 nc 命令用来进行原始的 TCP 网络通信的。Bash 和一些其他 shell 支持一种特殊的重定向语法:/dev/tcp/<host>/<port>

通过查看 Bash 的 man 文档REDIRECTION 一节,当重定向目标是下面几种路径,且操作系统没有提供这个路径时,Bash 会自行处理它们:

/dev/fd/<fd>
/dev/stdin
/dev/stdout
/dev/stderr
/dev/tcp/<host>/<port>
/dev/udp/<host>/<port>

阅读相关文档,模拟 Bash 的行为实现 cmd > /dev/tcp/<host>/<port>cmd < /dev/tcp/<host>/<port> 的重定向。你可能要用到的函数:socket, connect

方便起见,你只需要处理 <host> 是典型的 IPv4 地址(即 a.b.c.d 的形式,其中 abcd 均为 0 ~ 255 之间的整数)且 <port> 为 1 ~ 65535 之间的整数时的情况。

要求 满分
「可选」支持 TCP 重定向 10%

其他功能

我们一般使用的 shell 非常强大,你还可以自行了解下面这些语法的含义:

echo ~root               # 5% hint: /etc/passwd
echo $SHELL              # 5%
A=1 env                  # 5%
alias ll='ls -l'         # 5%
(sleep 10; echo aha) &   # 5%

可以自行选择实现。