shell 脚本-符号-基础语法

为了便于识别  建议 以.sh 结尾

shell脚本 可以放上所有的命令行的指令(源于bash)

shell脚本 是 解释型语言      c/c++ 是编译型语言

下面用到的 shell代码sh_1.sh

#!/bin/bash
cd ../
ls
pwd

解释型脚本的执行过程:

script.sh 是文本文件,根本没有代码段和 _start  函数 , exec 怎么执行。

解释:

Shellfork 一个子进程并调用 exec执行 ./script.sh这个程序,exec 系统调用应该把子进程的代码

段替换成./script.sh程序的代码段 ,并从它的 _start开始执行。然而 script.sh是个文本文件,根 本

没有代码段和 _start函数 ,怎么办呢 ?其实 exec还有另外一种机制 ,如果要执行的是一个文本文

, 并且第一行用 Shebang 指定了解释器 ,则用 解释器程序的代码段替换当前进程 ,并且从解释

器 的_start开始执行 ,而这个文本文件被当作命令行参数传给解释器 。因此, 执行上述脚本相

当于执 行程序

wKiom1e6tZagpKxfAAFq0WZtcj0114.png

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 ..命令改变的是子ShellPWD,不会影响到 交互式Shell1(对于文件sh, 交互式shell1会先创建一个子shell2,子shell2会再创建一个shell3,shell3遇见cd命令 会直接由shell2执行,改变的是shell2的路径,shell1的路径不变)

然而source ./script.sh  和 . ./script.sh 方式

则有不同的效果,cd ..命令是直接在交互式Shell1下执行,改变交互ShellPWD

对于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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值