CSCSHELL截止时间为周日晚上11:59。积分2002月14日后12点开始发售。A3–CSCSHELLCSC209 2024年冬季上次更新(3月15日):见5.7目录1.简介2.入门文件2.1. 实际开始3.CSCSHELL4.限制(shell的东西你不必实现)5.实施和要求5.1. 管理错误5.2. 外壳变量5.2.1. 创造5.2.2. 用法5.2.3. 路径5.2.4. 使用变量赋值进行错误检查5.3. 脚本和.cscsh_init5.4. 处决5.4.1. cd命令5.5. 文件重定向5.6. 管道5.7. 注释和澄清(请查看此处了解任何更新)6.标记1.简介在最初的几堂课中,我们一起学习了命令行的基本“语法”。我们聊了一会儿关于终端程序,以及这个叫做BASH的东西,或者更一般地说是shell。在本次作业中,您将实现一个基本的shell,该shell可以执行我们在到目前为止的课程(令我惊讶的是,手册页和vi也得到了支持,至少在teach.cs和我的自己的机器)。它将能够使用系统启动可执行文件(具有适当权限的文件)在特殊$PATH变量中列出的任何目录以及具有绝对或相对路径的任何目录中找到CSCSHELL2/11(例如,如果您键入./hello)当然,您还可以为这些提供命令行参数程序。这个shell将是交互式的,并且可以适度地编写脚本。当“交互式”时,键入终端程序(本身运行您的shell程序)将向其他正在运行的stdin提供输入可执行文件,以及显示stdout和stderr的输出。真的,你已经习惯了“命令行”,但由您编写!最终,它将支持文件重定向、管道和读取来自脚本文件的命令,因此您不局限于此shell的交互式使用。虽然我们无法完全支持任何和所有程序代 写CSC209,也就是说,安装在teach.cs上(这需要持续的维护和错误修复),我们将能够使用基本系统我们已经学会使用的程序,比如cd(实际上是一种特殊情况)、ls、mkdir、rm、grep、touch、man,cat、wc等——以及您为该课程开发的所有程序。此分配将具有大量的C字符串解析、文件i/o以及系统调用的标准用法(族):fork、exec、wait、pipe和dup。2.入门文件头文件cscshell.h有很多详细信息可以帮助您入门。请不要删除或编辑任何已经存在的内容,但可以随意添加更多的函数声明、宏和任何库不需要链接,可以在teach.cs上找到。不要更改结构定义,测试人员将使用这些定义,所以您只能使用它们。除了cscshell.h,还有附带的cscshell.c,它具有main()入口点为您的程序。不需要更改此源文件。如果您这样做,您只能添加功能,并且不删除任何现有功能(此外,我们不会测试任何其他功能您添加的功能)。parse.c和run.c文件是这个赋值的两个主要部分。您实现的每一项功能应该添加到这两个文件中的一个,这取决于它是用于解析shell文本,还是用于运行进程/其他可执行文件。2.1. 实际开始本作业的系统调用方面所需的材料将不会在课堂上介绍,直到第7周和第8周,所以尽快开始解析shell语法(因为您已经你需要的一切),并开始问自己,你需要什么才能完成剩下的工作。源文件包括许多附加信息,旨在引导您成功完成任务,以及一些助手和部分完成的功能。请随意开始根据cscshell的说法,如果你是那种人的话。3.CSCSHELLCSCSHELL3/11这个shell将类似于POSIX sh(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html)(很像BASH(https://www.gnu.org/software/bash/) ; 你可以在teach.cs机器、Ubunseu或WSL上找到;或zsh(https://wiki.archlinux.org/title/zsh#:~:text=Zsh is a power shell,改进 ab comple; 你可以在你的苹果产品上找到)。然而,我们将保持它的深度简化,重点关注以下功能:1.注释:任何一行后面跟着#字符的内容都是注释,因此被忽略2.变量分配和使用。见5.2。3.脚本执行,包括一个强制性的init脚本,该脚本最初必须在某个点4.cd命令,因为这不是可执行文件,它是由shell提供的系统控制访问5.使用系统调用启动具有任意字符串参数的可执行文件。程序是的第一部分CSCSHELL的任何可用行(前提是它不是cd、变量赋值或注释),并且可以在${PATH}目录中找到的名称,或者程序的明确路径(相对或绝对均可接受)。6.文件从stdout重定向到新的(或重新创建现有的)文件或附加到现有文件,如以及从文件重定向到stdin7.一个程序的标准输出和下一个程序标准输入之间的管道连接。所有进程都必须运行同时4.限制(shell的东西你不必实现)即使是最基本的POSIX sh(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html)支持更多的功能,事实上,它是一种相当全面的脚本语言。我们不会实现除了3中列出的功能之外的任何功能。一些明显的局限性:1.不支持元字符/匹配,例如“*”2.循环、条件语句、通用编程脚本功能3.脚本的命令行参数(如果没有2,则有些毫无意义。)4.重定向到/带有文件描述符编号(通过shell语法)5.命令历史记录和选项卡完成此外,只有一个环境变量($PATH)是相当有限的,因此维护变量作为链表。如果你真的很喜欢这项工作,我建议用一些如果你想锻炼的话,这些缺失的功能。5.实施和要求5.1. 管理错误CSCSHELL4/11由系统故障引起的错误,例如malloc内存不足,应该会导致shell终止然而,与CSCSHELL的使用有关的错误应该得到妥善处理结束shell时,这些应该只打印一条错误消息。标题cscshell.h列出了各种当出现问题时,要打印到stderr的带有(格式化)字符串的宏。您可以在中找到示例关于如何使用它们,特别是使用ERR_PRINT。如果您无法决定使用哪个错误,使用通用错误:#define ERR_EXECUTE_LINE“无法执行行。\n”更新:您可以使用ERR_PRINT宏中的任何错误消息来通过自动测试。对于使用哪条消息,不必有任何混淆。请注意,好的信息会对您有所帮助调试。5.2. 外壳变量5.2.1. 创造外壳变量必须指定为名称,仅由字母字符和组成_(下划线)字符。变量值是一个可以包含任何ASCII字符的字符串。请注意,行的换行符不是变量值的一部分。单个=必须将变量名和值分隔开,名称之间不能有空格和变量值中可以有空格,该值也可以为空(无,或只是'=''后面的空白)。这意味着您可能还会发现额外的空白,包括“\t”(当使用fgets读取输入时,'\n'和'\r'会变得混乱,所以我们会放松这一点,而不必担心)。不需要从值中删除此空白。一些极端但正确的变量作业可能如下所示:PATH=某些文本,其中肯定包含空格。OTHER_VAR=示例具有特殊(选项卡)空白。EMPTY_VAR_ONE=EMPTY_VAR_TWO=注意:EMPTY_VAR_TWO实际上有一些空格作为值,EMPTY_VARS_ONE没有,突出显示使用光标填充空白,以便更清楚地查看。以下是一些不正确分配的示例:BAD_VAR2=名称中有一个数字Badvar=等号之前不应该有空格。这是非常错误的,希望原因很清楚!注意:引用将被简单地假设为字符串的一部分,希望能让您的工作更轻松。因此,在本例中:OTHR_VAR=“你好世界”CSCSHELL5/11变量的名称是OTHR_VAR,它的值包括引号,存储:“helloworld”(13字符–以及作为C字符串的空终止符)。最后,请注意,如果您键入文字转义序列“\t”或“\n”,则它们被解释为两个字符,但由于我们在这个shell中不使用TAB进行自动完成,因此使用TAB键将为您提供“\t”字符,形式是插入一个大空格(和C字符值“\t”)。返回参考OTHR_VAR以上。5.2.2. 用法澄清(2004年3月):在本分配中,变量只能用于命令,如中所示,在创建过程中不考虑使用(不需要支持$VAR=使用一些$OTHER值,如果您愿意,您可以支持它)。1.简单shell中的变量用法包括在变量名称之前加前缀的$。如:SPECIAL_FILE=/etc/passwordecho“文件:$SPECIAL_file并不真正存在。”注意:如果您想将变量与有效变量的符号组合在一起,这是不明确的字符。由于空间的原因,变量的末尾很清楚,但请考虑:PROJECT_DIR=a3/解决方案/
标签:文件,5.2,shell,变量,CSC209,管道,系统故障,使用,VAR From: https://www.cnblogs.com/kantong/p/18083683