Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.docVIP

Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对

Shell编程入门:Linux解释器原理详细介绍使用Shell进行工作的人们对Unix/Linux下的Shell编程都很熟悉,在所有的Shell编程的书中都会提到#!/bin/bash,而这里到底包含了些什么?对操作系统而言,这一行字符串意味着什么?你可能会说,不就是会让/bin/bash程序来解释这个脚本程序吗?当然你是对的,看看我们的标题,这里我们谈谈解释器,让我们一起来看看脚本文件里的第一句到底对系统而言意味着什么。但有一点我们可先明确一下,所谓解释器就是指#!行后面的可执行的程序。 一、我们从exec族函数谈起 如果你从不写C程序,可能需要对本节的内容看得更为仔细并且试验一下。 代码: Quote: #include extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg , ..., char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); exec族函数一共有上面所列的5个,作用都是一样:执行一段新的代码。区别只是向函数传递的参数方式不同而已,我在这里讲讲execl函数:第一个参数path是指向设置了执行位文件的路径,后面的可变参数列表分别指向了传递给此执行文件的参数列表(包括了参数0,即是执行文件的名称)。最后一个参数为(char *) 0,表示参数列表结束。 对于解释器,exec族函数是这样做的(以execl为例),如果path是指向了一个脚本,脚本的第一行以#!开头,则这样调用: 以#!后面的字符串为命令,后面加上execl参数列表中指定的参数列表,这样形成了新的程序执行。 下面我们以例子来验证这个结果: 下面这个C程序的作用是回射所有命令行参数。 代码:   QUOTE: /* Program source : showargs.c * * Program name : showargs */ #include int main(int argc, char *argv[]) { int i; for(i = 0; i ); } return 0; }编译:gcc -o showargs showargs.c 执行: 代码:   QUOTE: $ pwd /home/kiron $ ./showargs arg1 arg2 arg[0]: ./showargs arg[1]: arg1 arg[2]: arg2我们在同一个目录下再写一个脚本: 代码:   QUOTE: #!/home/kiron/showargs addargs我没有打错,是的,这个脚本就只有一行, 英文代码 这个脚本我们命名为testexec,加上执行位后,执行情况如下: 代码: QUOTE: $ ./testexec arg[0]: /home/kiron/showargs arg[1]: addargs arg[2]: ./testexec怎么会这样?我猜会有人对第2个参数./testexec不理解,暂且卖个关子,再引出一个C程序: 代码:   QUOTE: /* Program source : mytest.c * * Program name : mytest */ #include int main(void) { execl(/home/kiron/testexec, testexec, arg1, arg2, (char *) 0); return 0; }编译:gcc -o mytest mytest.c 执行: 代码: $ ./mytest arg[0]: /home/kiron/showargs arg[1]: addargs arg[2]: /home/kiron/testexec arg[3]: arg1 arg[4]: arg2 仔细观察上面的三个例子,答案开始浮出水面了。正如在开始时讲到的,exec族函数的处理是把#!后面的字符串为命令,后面加上execl参数列表中指定的参数列表,这样形成了新的程序执行。分析一下mytest.c源程序,execl把命令的结果是这样执行的/home/kiron/testexec的内容是#!

您可能关注的文档

文档评论(0)

wuyuetian + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档