linux shell从入门到精通(一)——初识Shell程序
linux shell从入门到精通
- 0.第一个例程
- 0.1源码解析——位于第一行的#!
- 0.2自删除脚本
- 1.Shell的命令种类
0.第一个例程
这是一个完整的,可执行的Linux Shell程序,是一个相对简单的程序。
#! /bin/sh
echo "hello world!"
运行linux程序有三种方法:
- 使文件具有可执行权限,直接运行文件
- 直接调用命令解释器执行程序
- 使用source执行文件
0.1源码解析——位于第一行的#!
当命令行Shell执程序时,首先判断是否程序有执行权限。如果没有足够的权限,则系统会提示用户“权限不够”。从安全角度考虑,任何程序要在机器上执行时,必须判断执行这个程序的用户是否具有相应权限。在第一种方法中,我们直接执行文件,则需要文件具有可执行权限。
chmod命令可以修改文件的权限。+x参数程序使程序文件具有可执行权限。
命令行Shell接受到我们的执行命令,并且判断我们有执行权限后,则调用Linux内核命令新建(fork)一个进程,在新建的进程中调用我们指定的命令。如果这个命令文件是编译型的(二进制文件),则Linux内核知道如何执行文件。不幸的是,我们的.sh程序文件并不是编译型的文件,而是文本文件,内核并不知道如何执行,于是,内核返回“not execable format file”(不是可执行的文件类型)出错信息。Shell收到这个信息时说:“内核不知道怎么运行,我知道,这一定是个脚本!”
Shell知道这是个脚本后,启动了一个新的Shell进程来执行这个程序。但是现在的Linux系统往往拥有好几个Shell,到底挑选哪个Shell,这就要看脚本中意哪个了。在第一行中,脚本通过“#!/bin/sh”告诉命令行:“我只和他好,让他来执行吧!”
这种选择Shell方法有助于执行方式的通用化。用户在编写脚本时,在程序的第一行通过#!来设置运行Shell创建一个什么样的进程来执行此脚本。在我们的.sh中,Shell创建了一个/bin/sh(标准Shell)进程来执行脚本。
0.2自删除脚本
当你运行这个脚本时,基本上什么都不会发生,当然这个文件消失不见了!
#! /bin/rm
WHATEVER=65
echo "This line will never print!"
exit $WHATEVER
1.Shell的命令种类
Linux Shell可执行的命令有3种:内建命令、Shell函数和外部命令。
- 内建命令就是Shell程序本身包含的命令。这些命令集成在Shell解释器中,例如,几乎所有的Shell解释器中都包含cd内建命令来改变工作目录。部分内建命令的存在是为了改变Shell本身的属性设置,在执行内建命令时,没有进程的创建和消亡;另一部分内建命令则是I/O命令,例如echo命令。
- Shell函数是一系列程序代码,以Shell语言写成,它可以像其他命令一样被引用。
- 外部命令是独立于Shell的可执行命令。例如find、grep、echo.sh。命令行Shell在执行外部命令时,会创建一个当前Shell的复制进程来执行。在执行过程中,存在进程的创建和消亡。外部命令的执行过程如下:
①调用POSIX系统fork函数接口,创建一个命令行Shell进程的复制(子进程)
② 在子进程的运行环境中,查找外部命令在Linux文件系统中的位置,如果外部命令给出了完全路径,则跳过查找这一步:
③子进程里,以新程序取代Shell复制并执行(exec),此时父进程进入休眠,等待子进程执行完成;
④子进程执行完毕后,父进程接着从终端读取下一条命令。