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/testex

shell编程入门 linux解释器原理,Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.doc...相关推荐

  1. Linux、GUN/Linux、GUN、GPL以及各个发行版本详细介绍-扫盲篇

    什么是Linux? 也许很多人会不屑的说,Linux不就是个操作系统么.错!Linux不是一个操作系统,严格来讲,Linux只是一个操作系统中的内核.内核是什么?内核建立了计算机软件与硬件之间通讯的平 ...

  2. Linux小工具(3)之/proc目录详细介绍(上)

    目录 前言 一.平台说明 二./proc目录概述 三.准备使用 (1)进程描述文件夹 (2)/proc目录下常见的文件夹 前言 Linux系统的使用有别于Windows系统,无论是系统信息还是应用软件 ...

  3. python编程模式是什么_python 开发的三种运行模式详细介绍

    Python 三种运行模式 Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用python既取决于 ...

  4. linux下qt和wine,Ubuntu下安装wine详细介绍

    Ubuntu安装wine一般使用两种方式,源码编译或者从网络源安装. 源码编译安装相对比较稳定,速度快.效率高,但是需要时间编译,相比一分钟的源安装,几十分钟的编译确实很长.源安装是别人已经帮你编译好 ...

  5. 创建linux启动盘,linux系统中如何创建windows启动盘的详细介绍

    平时工作中用到linux的操作命令较多,因此为了方便,就给电脑装了双系统,一般工作的时候,都选择进入linux系统.但是今天有件工作之外的事情需要解决下:创建一个windows启动盘.如果按照往常来说 ...

  6. ansible自动化运维工具的详细介绍、使用、工作原理、安装方式、与被管理节点建立信任关系等等

    ansible简介 Ansible 是一个IT自动化工具,它能够配置系统.部署软件.编排更复杂的it任务,如连续部署或零停机时间滚动更新 Ansible用python编写,尽管市面上已经又很多可供选择 ...

  7. qq怎么看linux教程,LinuxQQ教程 LumaQQ的安装和使用详细介绍

    作者: 李祥敬 2009-12-09/16:07 LumaQQ是QQ的跨平台版本,目前包括Linux.MacOS.Windows及其它类UNIX版本等;本文主要说说LumaQQ在Linux的安装; 一 ...

  8. Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示

     1.依赖的头文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> 2.函数定 ...

  9. 知识图谱入门知识(二)事件抽取(EE)详细介绍

    学习内容 本文主要详细介绍事件抽取EE的概念: 装载自:李景鹏 啥是事件抽取(Event Extraction)? 同时这里关于事件抽取的介绍也可以作为补充: 分层网络用于事件参数抽取 事件抽取 = ...

最新文章

  1. MFC的“不知从哪调用”的消息处理函数
  2. linux ip别名和辅助ip地址
  3. boost::mp11::mp_map_contains相关用法的测试程序
  4. golang实现聊天室(五)
  5. oracle清除bin,Oracle recyclebin详解(闪回删除的表)
  6. linux自动输入sudo密码_用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
  7. JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET
  8. java写法可能存在的 java.lang.OutOfMemoryError: Java heap space 问题
  9. Python基础手册
  10. java计算机毕业设计美发门店管理系统源码+系统+数据库+lw文档
  11. GB28181协议常见几种信令流程(一)
  12. 【STC15】使用PCA0和PCA1做的模拟串口
  13. wps怎么导入access_WPS Access 2013_access 2013下载-下载之家
  14. 4_unittest测试框架_管理测试用例生成测试报告
  15. 如何打造一个自动化的前端项目
  16. python哪个字体好看_Python实现对比不同字体中的同一字符的显示效果
  17. 高校如何优雅的使用Ipv6--抱着道长的大腿
  18. c语言pow立方根,C#math.pow立方根计算(C# math.pow cube root calculation)
  19. word中全部数字、大小写字母、标点更改为新罗马字体Times News Romans
  20. 插入数据 java_JAVA插入数据笔记

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 0089-22DInternet和Intranet应用 参考试题
  2. 【渝粤题库】陕西师范大学163202 管理学原理 作业(高起本 专升本)
  3. python3 ftp.mlsd,python3中的ftp目录
  4. 蓝桥杯基础模块06_1:定时器计数器
  5. ajax post提交特殊字符,如何利用jQuery post传递含特殊字符的数据
  6. linux结束所有任务命令行,Linux基础命令(15)定时任务
  7. matlab 进度条/waitbar 显示运行进度
  8. 杀java_java怎么杀掉java进程
  9. 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等
  10. 80端口请求太多超时 php_apmserver 80端口老是被占用问题解决