Shell Script运行方式的差异

Posted pulp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell Script运行方式的差异相关的知识,希望对你有一定的参考价值。

source, sh script, ./script

不同的script运行方式还造成不一样的结果!尤其对bash的环境影响很大。通常来说,shell脚本有一下几种运行方式:

  • 利用直接运行的方式运行script
  • 利用source来运行脚本
  • 利用. 小数点的方式来运行脚本

直接运行script

当使用直接命令运行(不论是绝对路径/相对路径还是$PATH内),或者是利用bash(或sh)来运行脚本时,该script都会使用一个新的bash环境来运行脚本内的命令!

也就是说,使用这种运行方式时,其实script实在子程序的bash内运行的!【当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回父程序中】

以下面的脚本为例:

#!/bin/bash                                                                 
# Program:
#   User inputs his first name and last name. Program shows his full name. #History:
# 2018/10/6 keith   First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
read -p "Please input your first name:" firstname  #提示输入
read -p "Please input your last name:" lastname #输入
echo -e "
Your fullname is:$firstname $lastname" #打印到屏幕

这个交互式脚本可以让使用者自行配置两个变量,分别是firstname和lastname,如果直接运行该命令时,会发现script中帮你配置的firstname变量和lastname变量在bash中并没有返回值,是不存在的。而这两个变量在script运行中却是有效的!也就是说,这两个变量在父程序的bash中并不存在!

事实上,当我们使用直接运行的方式来处理脚本时,系统会给我们一个新的bash让我们运行sh02.sh里面的命令,因此sh02.sh中的firstname和lastname等变量其实实在子程序中的bash内运行的。当sh02.sh运行完后,子程序的bash中的所有数据会被移除,因此我们在父程序的bash下echo $firstname 时,就看不到任何返回值了。

技术分享图片

利用source来运行脚本:在父程序中运行

如果使用source来运行脚本,我们再在父程序的bash中echo $firstname 发现,在脚本中的变脸firstname和lastname 有返回值了!

这是因为source对script的运行会在父程序中运行,因此各项动作都会在原本的bash内生效! 这也是为什么你在更改玩 .bashrc 的配置后不必注销系统,只需source ~/.bashrc 就会生效的原因!

技术分享图片

以上是关于Shell Script运行方式的差异的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell Script初识

Linux笔记:4-Shell Script

Linux - 通过操作文件锁来实现shell script进程单实例

shell script执行的几种方式

为啥浏览器不在通过 fetch API 检索的 HTML 片段中运行 <script>? [复制]

shell入门笔记1:执行方式运行方式变量替换