程序编译

编译程序(五):1、source 是什么,source filename”、". filename”与“sh filename”、“./filename”的区别

2019-11-27 23:10:41 admin 597

一、source命令,也称“点命令”,也就是一个点符号(.),是bash的内部命令。

1、命令格式

source filename # filename必须是可执行的脚本文件 

或者 . filename # 注意“.”号后面还有一个空格

2、source作用:

通知当前shell读入路径为filename的文件并依次执行文件中的所有语句。

通知库的路径并依次按照文件中的库的路径寻找库文件

...........

二、“source filename”、". filename”与“sh filename”、“./filename”这三个命令都可以用于执行一个脚本文件,那么它们之间的区别又如何呢?

当shell脚本具有可执行权限时,用sh filename与./filename是没有区别的。./filename是因为当前目录没有在PATH中,所以"."是用来表示当前目录的。sh filename会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell。

source filename读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。

也就是说:

1)“sh filename”、“./filename”在当前终端里,变量相当于是局部变量。

2)“source filename”、". filename”在当前终端里,里面的变量相当于全局定量,不论你是否定义export

举例如下:

1、创建 getbash文件如下

[test_pkuhpc@login12 test]$ cat getbash

#!/bin/bash

export PPP=ppp

DDD=ddd

2、source后的结果

[test_pkuhpc@login12 test]$ source getbash 

[test_pkuhpc@login12 test]$ echo DDD=$DDD PPP=$PPP

DDD=ddd PPP=ppp

3、sh或者./getbash后的结果

退出终端重新登录

[test_pkuhpc@login12 test]$ exit ##退出重新登录

[test_pkuhpc@login12 test]$ sh getbash 

[test_pkuhpc@login12 test]$ echo DDD=$DDD PPP=$PPP

DDD= PPP=

执行 ./getbash

[test_pkuhpc@login12 test]$ chmod u+x getbash 

[test_pkuhpc@login12 test]$ ./getbash 

[test_pkuhpc@login12 test]$ echo DDD=$DDD PPP=$PPP

DDD= PPP=

三、北京大学北极星高性能计算平台,source举例。

根据前面的定义,按照顺序执行,那么如果不使用系统的gcc的话,把自己定义的路径放在默认PATH前面:

[test_pkuhpc@login12 test]$ cat /appsnew/source/gcc-8.3.0.sh 

#!/bin/bash

export LD_LIBRARY_PATH=/appsnew/usr/gcc/gcc-8.3.0/lib64:$LD_LIBRARY_PATH

export PATH=/appsnew/usr/cmake/cmake-3.14.3:/appsnew/usr/gcc/gcc-8.3.0/bin:$PATH

[test_pkuhpc@login12 2019test]$ which gcc

/bin/gcc

[test_pkuhpc@login12 2019test]$ gcc --version 

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)

----------------------------------------------------------------

[test_pkuhpc@login12 test]$ . /appsnew/source/gcc-8.3.0.sh 

[test_pkuhpc@login12 test]$ which gcc

/appsnew/usr/gcc/gcc-8.3.0/bin/gcc

[test_pkuhpc@login12 2019test]$ gcc --version 

gcc (GCC) 8.3.0

这样就变成非系统的gcc

四、北京大学北极星高性能计算平台source目录简介,见下篇,请点击

首页
资源&收费
集群
成果
问答