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 "\nYour 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 时,就看不到任何返回值了。

子程序bash

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

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

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

图示

posted @ 2018-10-06 11:06  Keith_fool  阅读(249)  评论(0编辑  收藏  举报