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变量。
注:export为将当前进程的变量传递给子进程,可以理解JAVA为父类的私有变量添加了构造器,这样子类就可以访问这个变量。但两个子进程中的变量无法这样获得。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)