Bash—source命令&export命令&bashrc文件

发布时间 2023-05-03 14:25:49作者: のNice

当不使用 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。

1.jpg

source 命令用于执行一个脚本,但它不像直接执行脚本时,会新建一个子 shell,它是在当前 shell 执行脚本。如下图所示,我并没有用 export 定义 VB,当直接执行 test.sh 脚本时,输出空值,访问不到 VB 变量,但当使用 source 执行 test.sh 时,它成功输出了 VB 的值,并保存了对 VB 的修改。

1.jpg

export 命令常用来修改环境变量,比如执行export PATH=$PATH:~,那么就可以在任何目录下执行 test.sh 脚本,因为 Linux 会去 PATH 变量包含的路径下寻找 test.sh,如果存在多个 test.sh,那么只会执行第一个找到的 test.sh。export 设置环境变量是暂时的,只在本次登录中有效,可修改如下文件来使命令长久有效:

  • 修改 profile 文件,执行命令echo 'export PATH=$PATH:~' >> /etc/profilesource /etc/profile,但修改这个文件对所有用户都会产生影响,所以不建议使用这个。
  • 修改当前用户根路径下的~/.bashrc文件,执行命令echo 'export PATH=$PATH:~' >> ~/.bashrcsource ~/.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 脚本