为了便于识别 建议 以.sh 结尾
shell脚本 可以放上所有的命令行的指令(源于bash)
shell脚本 是 解释型语言 c/c++ 是编译型语言
下面用到的 shell代码sh_1.sh
#!/bin/bash cd ../ ls pwd
解释型脚本的执行过程:
script.sh 是文本文件,根本没有代码段和 _start 函数 , exec 怎么执行。
解释:
Shell会fork 一个子进程并调用 exec执行 ./script.sh这个程序,exec 系统调用应该把子进程的代码
段替换成./script.sh程序的代码段 ,并从它的 _start开始执行。然而 script.sh是个文本文件,根 本
没有代码段和 _start函数 ,怎么办呢 ?其实 exec还有另外一种机制 ,如果要执行的是一个文本文
件, 并且第一行用 Shebang 指定了解释器 ,则用 解释器程序的代码段替换当前进程 ,并且从解释
器 的_start开始执行 ,而这个文本文件被当作命令行参数传给解释器 。因此, 执行上述脚本相
当于执 行程序
1. 交互 Shell(bash)fork/exec一个子 Shell(sh)用于执行脚本 ,父进程 bash等待子进程 sh终止。
2. sh读取脚本中的 cd ..命令 ,调用相应的函数 执行内建命令 ,改变当前工作目录为上一级
目 录。
3. sh读取脚本中的 ls命令 ,fork/exec这个程序 ,列出当前工作目录下的文件 ,sh等待 ls终止。
4. ls终止后 ,sh继续执行 ,读到脚本文件末尾 ,sh终止。
5. sh终止后 ,bash继续执行 ,打印提示符等待用户输入。
如果将命令行下输入的命令用 ()括号括起来 ,那么也会 fork出一个子 Shell执行小括号中的命令 ,
一 行中可以输入由分号 ;隔开的多个命令 ,比如 : $ (cd ..;ls -l)
和上面两种方法执行 Shell脚本的效果是相同的 ,cd ..命令改变的是子 Shell的 PWD,而不会影响
到 交互式Shell。
chmod + x script.sh方式
sh文件中,cd ..命令改变的是子Shell的PWD,而不会影响到 交互式Shell1(对于文件sh, 交互式shell1会先创建一个子shell2,子shell2会再创建一个shell3,shell3遇见cd命令 会直接由shell2执行,改变的是shell2的路径,shell1的路径不变)。
然而source ./script.sh 和 . ./script.sh 方式
则有不同的效果,cd ..命令是直接在交互式Shell1下执行的,改变交互式Shell的PWD
对于php 。。。脚本语言 执行也是 解释器这个流程
sh_1.sh代码:
#!/bin/bash
cd ../
ls
pwd
[bozi@localhost 1_shell]$ /bin/bash sh_1.sh // shell脚本中 cd 直接在子bash中运行 整个过程父进程 不参与
1_shell
/home/bozi/linux_test/shell
[bozi@localhost 1_shell]$ pwd
/home/bozi/linux_test/shell/1_shell // 所以 不影响父进程 的路径 还在子进程的路径中
[bozi@localhost 1_shell]$ cd .. // cd内置命令 shell 自己直接亲自执行(不创建子进程) 影响自己的路径
[bozi@localhost shell]$ pwd
/home/bozi/linux_test/shell // 直接执行 影响了 跑到上级目录
路径
[bozi@localhost shell]$ ll
总用量 4
drwxrwxr-x. 2 bozi bozi 4096 8月 14 10:18 1_shell
[bozi@localhost shell]$ cd 1_shell/
[bozi@localhost 1_shell]$ ll
总用量 4
-rw-rw-r--. 1 bozi bozi 298 8月 14 10:18 sh_1.sh
source 与(. 命令一样)
例子:
source 不创建子bash,遇见bash中有内建命令 cd 交互式shell(父进程自己直接执行) 所以 退出时 父进程的路径 变了 影响父进程
[bozi@localhost 1_shell]$ ll
总用量 4
-rw-rw-r