shell语法
如果输入不是注释的话,shell将会对输入的内容进行分解和解析,最终分解为可以处理并返回值的命令和结构。当分解完成就会调用fork和exec来执行,执行的情景有如下几种
- 从文件或者字符串或者用户输入
- Input is broken up into words and operators, obeying the quoting rules,这句看了半天,愣是没看懂。。。。。。
- shell解析出的简单的或者复杂的命令
- Bash执行严格的Shell命令,将命令打散成为命令和参数和文件的list
- 重定向被从命令中剔除出来,如果有必要的话就会执行。
- 命令已经被执行
- 可选的,shell会等待命令执行完毕获取其返回值
shell命令是由命令本身和参数组成由空格分割,例如 touch file1 file2 file3。多个简单命令可以用管道分隔,在循环或者条件判断或者其他组织形式中使得一个命令的输出成为另一个命令的输入。
比如
ls | more gunzip abc.tar.zip | tar -zxf
shell函数
shell函数是一种代码组织的形式,一次组织多次调用。这个我们后文会提到
shell参数
参数可以是一个名字,但是变量则是值,必须用内建命令 declare来新建,如果没有赋值则默认未null。要删除变量只能通过内建的unset来删除。
如何使用变量和参数,我们后文再谈
Shell扩展
好吧,这个比较冗杂,之后再说
重定向
在一个命令被执行之前,命令的输入或者输出会被解析出来,然后你懂得。
执行命令
命令执行的时候,赋值语句和重定向被保存以备后用。其他部分被展开,第一个名词被用来当作命令的名字,剩下的被当作参数,然后重定向起效。
一个shell命令的执行将会有如下的行为:
- 检查命令中是否含有,如果没有则检查是否存在正在查找的函数。
- 如果不包含正在查找的函数,则检查是否是内建函数列表中的命令
- 如果不是正在查找的函数也不是内建函数列表中的命令,就到PATH中取寻找匹配的命令。shell利用hash table来缓存了path中的命令,所以不会存在遍历文件夹的情况。
- 如果查找还是失败则会返回127并打印错误信息
- 如果查找到或者上述查找成功,命令就将会被在一个隔离的环境中执行。
- 如果执行失败是因为文件不可以执行并且文件也不是一个文件夹,就认为这个文件是一个shell脚本
- 如果命令不是异步执行的,shell就将会等待其返回信息以及返回值