Linux'执行Bash或sh脚本时,有三种不同的方法,

1. ./+文件名执行。 需要注意文件以及用户是否拥有可执行权限。

2. sh+文件名执行。 文件无需可执行权限

3. source 文件名 文件无需可执行权限。

不同点:

1.执行方式的不同

当脚本以./ 与sh方式执行时,系统会自动生成一个全新的bash子进程用来执行程序。可以理解为单间。大致如下

当脚本以source执行时,系统是使用原本已有公共的bash进程(存疑,为自己猜测?)进行该脚本,可以理解为公共空间。大致如下:

2.由于执行方式的不同引起的对于当前进程变量的应用(是否可以理解为系统主进程的变量?)问题。具体验证如下,首先在命令行中定义一个变量 meg ,

meg=thisisameg

然后在脚本中添加打印变量的代码。

#! /bin/sh
echo $meg

分别使用./ 与source运行代码结果如下

./无法获得变量meg, 而source却可以获得变量内容。

可以将其理解为meg变量为JAVA编程中的父类的私有变量,且未写set/get方法。此时,子bash进程无法访问父类的私有变量。而source由于是直接在父类中执行,所以能够调用父类中的私有变量。解决的方法如下:

在命令行中输入:

export meg=thismegisnotquit

,此时再次运行结果为

此时即可./执行方式也可访问meg变量。

2,使用declare -x meg 可以达到同样的效果

:export为将当前进程的变量传递给子进程,可以理解JAVA为父类的私有变量添加了构造器,这样子类就可以访问这个变量。但两个子进程中的变量无法这样获得。

Logo

更多推荐