IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> shell,exec,source执行脚本的区别 -> 正文阅读

[系统运维]shell,exec,source执行脚本的区别

一、sh方式

使用$ sh script.sh执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。
$ ./script.sh与$ sh script.sh等效。

例子

使用loop.sh脚本反复打印当前进程号。

$ vim loop.sh
#!/bin/sh
while [ 1 = 1 ]; do
    echo $$
    export aaa="aaa"
    export bbb="bbb"
    echo $aaa $bbb
    sleep 1
done

查看父shell的进程号。

[root@app01 linux]# echo $$
12197
[root@app01 linux]#

在loop.sh中,打印子shell进程号18313。

[root@app01 linux]# ./loop.sh
18313
aaa bbb
18313
aaa bbb
18313
aaa bbb

不停止循环,再打开一个shell,发现18313是12197的子进程

[root@app01 linux]# ps -ef|grep 12197
root     12197 12194  0 14:37 pts/0    00:00:00 -bash
root     18313 12197  0 17:26 pts/0    00:00:00 /bin/sh ./loop.sh
root     18461 11040  0 17:26 pts/1    00:00:00 grep --color=auto 12197

停止循环,打印变量为空。

[root@app01 linux]# echo $aaa

[root@app01 linux]#

二、source方式

使用$ source script.sh方式,在当前上下文中执行脚本,不会生成新的进程。脚本执行完毕,回到当前shell。source方式也叫点命令,$ . script.sh与$ source script.sh等效。注意在点命令中,.与script.sh之间有一个空格。

例子

loop.sh脚本的进程id和shell的相同

[root@app01 linux]# echo $$
12197
[root@app01 linux]# . loop.sh
12197
aaa bbb
12197
aaa bbb
12197
aaa bbb

停止循环,能够打印出 $aaa 的值

[root@app01 linux]# echo $aaa
aaa
[root@app01 linux]#

三、exec方式

使用exec command方式,会用command进程替换当前shell进程,并且保持PID不变。执行完毕,直接退出,不回到之前的shell环境。

四、使用sh和source方式对上下文的影响

在sh和source方式下,脚本执行完毕,都会回到之前的shell中。但是两种方式对上下文的影响不同呢。

此例中,jump.sh脚本执行如下操作:1)跳到/,2)打印当前工作目录,3)打印Hello。

$ vim jump.sh
#!/bin/sh
cd /
pwd
echo Hello

#通过sh执行脚本时,修改的上下文不会影响当前shell。jump.sh退出以后,工作目录保持不变。

$ pwd
/home/riversec
$ ./jump.sh 
/
Hello
$ pwd
/home/riversec

通过source执行脚本时,修改的上下文会影响当前shell。jump.sh退出以后,当前工作目录变成了/。

$ pwd
/home/riversec
$ source jump.sh 
/
Hello
$ pwd
/
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:59:27  更:2022-03-24 01:00:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:26:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码