Caffeinated 6.828:练习 shell
创始人
2024-03-01 22:51:03
0

通过在 shell 中实现多项功能,该作业将使你更加熟悉 Unix 系统调用接口和 shell。你可以在支持 Unix API 的任何操作系统(一台 Linux Athena 机器、装有 Linux 或 Mac OS 的笔记本电脑等)上完成此作业。请在第一次上课前将你的 shell 提交到网站

如果你在练习中遇到困难或不理解某些内容时,你不要羞于给员工邮件列表发送邮件,但我们确实希望全班的人能够自行处理这级别的 C 编程。如果你对 C 不是很熟悉,可以认为这个是你对 C 熟悉程度的检查。再说一次,如果你有任何问题,鼓励你向我们寻求帮助。

下载 xv6 shell 的框架,然后查看它。框架 shell 包含两个主要部分:解析 shell 命令并实现它们。解析器只能识别简单的 shell 命令,如下所示:

ls > y
cat < y | sort | uniq | wc > y1
cat y1
rm y1
ls | sort | uniq | wc
rm y

将这些命令剪切并粘贴到 t.sh 中。

你可以按如下方式编译框架 shell 的代码:

$ gcc sh.c

它会生成一个名为 a.out 的文件,你可以运行它:

$ ./a.out < t.sh

执行会崩溃,因为你还没有实现其中的几个功能。在本作业的其余部分中,你将实现这些功能。

执行简单的命令

实现简单的命令,例如:

$ ls

解析器已经为你构建了一个 execcmd,所以你唯一需要编写的代码是 runcmd 中的 case ’ ‘。要测试你可以运行 “ls”。你可能会发现查看 exec 的手册页是很有用的。输入 man 3 exec

你不必实现引用(即将双引号之间的文本视为单个参数)。

I/O 重定向

实现 I/O 重定向命令,这样你可以运行:

echo "6.828 is cool" > x.txt
cat < x.txt

解析器已经识别出 ‘>’ 和 ‘<’,并且为你构建了一个 redircmd,所以你的工作就是在 runcmd 中为这些符号填写缺少的代码。确保你的实现在上面的测试输入中正确运行。你可能会发现 openman 2 open) 和 close 的 man 手册页很有用。

请注意,此 shell 不会像 bashtcshzsh 或其他 UNIX shell 那样处理引号,并且你的示例文件 x.txt 预计包含引号。

实现管道

实现管道,这样你可以运行命令管道,例如:

$ ls | sort | uniq | wc

解析器已经识别出 “|”,并且为你构建了一个 pipecmd,所以你必须编写的唯一代码是 runcmd 中的 case ‘|’。测试你可以运行上面的管道。你可能会发现 pipeforkclosedup 的 man 手册页很有用。

现在你应该可以正确地使用以下命令:

$ ./a.out < t.sh

无论是否完成挑战任务,不要忘记将你的答案提交给网站

挑战练习

如果你想进一步尝试,可以将所选的任何功能添加到你的 shell。你可以尝试以下建议之一:

  • 实现由 ; 分隔的命令列表
  • 通过实现 () 来实现子 shell
  • 通过支持 wait 在后台执行命令
  • 实现参数引用

所有这些都需要改变解析器和 runcmd 函数。


via: https://sipb.mit.edu/iap/6.828/lab/shell/

作者:mit 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

MIT

相关内容

斯坦星球PythonAI课...
2025-05-06 14:17:15
传美国将全面对华禁售AI芯...
来源:云头条、CINNO综合整理 3 月 1 日,一位华尔街分析师...
2025-03-02 08:54:08
MIT团队新系统30倍速提...
(来源:MIT News) 在医疗图像处理、语音识别等应用中,AI...
2025-02-11 21:43:48
不知道如何在Java中使用...
要在Java中使用Hermit获取本体中的对象属性,可以使用以下代...
2025-01-12 07:31:26
不知道如何使用winapi...
要使用WinAPI和C++设置EM_SETLIMITTEXT的值,...
2025-01-12 06:30:06
不知道如何使用带有异步监听...
在Node.js中,可以使用EventEmitter类来实现事件驱...
2025-01-12 06:00:21

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...