天天看点

Linux Shell 学习笔记1:Shell程序的运行及基本介绍

运行Linux的三种方法:

1.使文件具有可执行的权限,直接运行程序。

2.直接调用命令解释程序执行程序。

3.使用source执行程序。

命令行shell执行程序的时候,首先需要判断程序是否具有可执行权限,如果权限不够,则程序会被拒绝执行。

chmod命令可以修改文件的权限。+x参数可以使程序文件具有可执行权限。

(程序文件可以分为二进制的文件(例如/bin下的ls,mkdir等命令文件),或者脚本文件)

命令行shell接收到执行命令后,并且判定用户具有执行权限后,则调用Linux内核命令fork一个进程,在新建的进程中调用我们指定的命令文件。

如果这个命令文件(例如 ls等命令)是编译性(二进制文件),则Linux内核知道如果执行。

如果这个命令文件是一个文本文件的时候,Linux内核则会返回”not executeable file”的错误,则shell收到这个消息时,会识别出命令文件为脚本。shell在判断出这个文件是一个脚本文件时,启动一个新的shell进程来执行这个程序。但是,现在的Linux系统一般拥有好多个shell环境,因此,一般的脚本文件会在第一行通过命令 #!/bin/shell名称(bash, python, php等)来指定脚本的类型。

命令行在执行到第一行的 #!bin/bash时,发现#!时,会读取其后的字符,从而获取解释器的完整路径,如果解释器有参数的话,也一并读取进行处理。

获取完整解释器路径的命令如下:

$> whereis bash

/bin/bash

shell命令的种类

Linux Shell命令可以分为3类:内建命令,shell函数,外部命令

(1)内建命令就是shell程序本身包括的命令。

这些命令集成在shell解释器中,例如,几乎所有的shell解释器都包含cd内建命令来改变工作目录,部分内建命令的存在就是为了改变shell本身的属性设置的,在执行内建命令是,没有进程的创建和消亡;另一部份内建命令则是I/O命令,例如echo命令。

(2)Shell函数是一系列程序代码,以shell语言写成,它可以像其他命令那样被引用。

(3)外部命令是独立于shell的可执行程序。例如find,grep,echo.sh。命令行shell在执行外部命令时,会创建一个当前shell的复制进程来执行。在执行过程中,存在进程的创建和消亡。

外部命令的执行过程如下:

a.调用POSIX系统fork函数接口,创建一个命令行shell进程的复制(子进程)。

b.在子进程的运行环境中,查找外部命令在Linux文件系统中的位置,如果外部命令给出了完整路径,则略过查找这一步。

c.在子进程里,以新程序带去shell拷贝并执行(exec),此时父进程进入休眠,等待子进程执行完毕。

d.子进程执行完成后,父进程接着从终端读取下一条命令。

示意图如下:

Linux Shell 学习笔记1:Shell程序的运行及基本介绍

1.子进程创建初期和父进程是一模一样的,但是子进程不能够改变父进程的参数变量。

2.只有内建命令才能改变命令行shell的属性设置(环境变量)。

Linux下使用第二种方法和第三种方法执行程序的区别(即 ./demo.sh 和 source demo.sh执行的区别):

使用source执行shell脚本时,并不会创建子进程,而是在父进程中直接执行,因此当使用source执行bash脚本时,可以直接改变父进程的环境变量。

也就是说在使用source执行bash脚本时,并没有进程的创建和消亡过程。

source 语法:

source 文件名 或 . 文件名

描述:

source使用shell进程本身执行脚本文件,source命令也被称作“点命令“,通常用于重新执行刚修改好的初始化文件,使之立即生效。

行为模式:

和其它运行脚本的模式不同,source命令影响shell进程本身,在脚本执行过程中,并没有进程的创建和销毁过程。

Note:

当需要在程序中修改当前shell本身的环境变量时,使用source命令。

欢迎关注我的微信帐号!

微信号:CoderPJ

二维码:

及时查看我发布的博客,请关注我个人的微信公众号!谢谢!

长按图片–>识别二维码即可!

Linux Shell 学习笔记1:Shell程序的运行及基本介绍

继续阅读