当不使用 source 命令执行脚本时,会创建一个子 shell,在该子 shell 中执行完脚本后退出子 shell。不是用 export 定义的变量只对该 shell 有效,对子 shell 是无效的。如下图所示,一开始 VA 没有用 export 定义,所以第一次执行 test.sh 脚本时子 shell 访问不到父 shell 定义的 VA,输出空。只有使用 export 定义的变量才会被复制到子 shell 中,如下图重新用 export 定义了 VA,第二次执行 test.sh 时成功输出了 VA 的值。子 shell 中对变量的修改是无法影响到父 shell 中变量的值,比如说在 test.sh 中执行 VA=123
,当执行完 test.sh 后,输出 VA 的值依旧等于 45。
source 命令用于执行一个脚本,但它不像直接执行脚本时,会新建一个子 shell,它是在当前 shell 执行脚本。如下图所示,我并没有用 export 定义 VB,当直接执行 test.sh 脚本时,输出空值,访问不到 VB 变量,但当使用 source 执行 test.sh 时,它成功输出了 VB 的值,并保存了对 VB 的修改。
source 命令的另一个用途,是在脚本内部加载外部库。下面脚本在内部使用 source 命令加载了一个外部库,然后就可以在脚本里面,使用这个外部库定义的函数。source 有一个简写形式,可以使用一个点(.
)来表示,比如. test.sh
和source test.sh
是一样的。
source ./lib.sh
function_from_lib
export 命令常用来修改环境变量,比如执行export PATH=$PATH:~
,那么就可以在任何目录下执行 test.sh 脚本,因为 Linux 会去 PATH 变量包含的路径下寻找 test.sh,如果存在多个 test.sh,那么只会执行第一个找到的 test.sh。export 设置环境变量是暂时的,只在本次登录中有效,可修改如下文件来使命令长久有效:
- 修改 profile 文件,执行命令
echo 'export PATH=$PATH:~' >> /etc/profile
和source /etc/profile
,但修改这个文件对所有用户都会产生影响,所以不建议使用这个。 - 修改当前用户根路径下的
~/.bashrc
文件,执行命令echo 'export PATH=$PATH:~' >> ~/.bashrc
和source ~/.bashrc
,这样就只对当前用户生效,不会影响到其它用户。
bashrc
文件主要保存个人的一些个性化设置,如命令别名、路径等,每次修改 .bashrc
后,使用 source ~/.bashrc
(或者 . ~/.bashrc
)就可以立刻加载修改后的设置,使之生效。一般会在.bash_profile
文件中显式调用.bashrc
。登陆 linux
启动 bash
时首先会去读取 ~/.bash_profile
文件,这样 ~/.bashrc
也就得到执行了,你的个性化设置也就生效了。利用这一特性,可以实现一些个性化设置,如:Linux 系统开机执行自动某个脚本文件等,这在自动化运维方面有一定的用处。比如在~/.bashrc
中追加以下命令:
echo 'Hello world'
python3 /home/username/test.py
那么在开机时 shell 就会输出 Hello world
并执行 test.py 脚本