开发工具

Shell之 source 指令

source 是 Shell 命令之一,用于在当前 Shell 会话中读取并执行指定脚本文件中的命令。这意味着,当你使用 source 命令执行一个脚本时,脚本中的变量、函数定义等都会在当前 Shell 会话中生效,而不是在一个子 Shell 中执行。


基本语法

source 文件名

或者

. 文件名

注意:.(点)是 source 命令的简写形式,两者在功能上完全等价。


作用

变量赋值:脚本中定义的变量会在当前 Shell 会话中可用。

函数定义:脚本中定义的函数可以在当前 Shell 会话中被调用。

别名设置:脚本中设置的别名会在当前 Shell 会话中生效。

环境变量修改:脚本中修改的环境变量会在当前 Shell 会话中反映出来。


与 ./脚本名 的区别

./脚本名:这会启动一个新的子 Shell 来执行脚本中的命令。脚本执行完毕后,子 Shell 会关闭,其中的变量、函数定义等不会影响到父 Shell。

source 脚本名 或 . 脚本名:这会在当前 Shell 会话中执行脚本中的命令,因此脚本中的任何更改(如变量赋值、函数定义等)都会在当前 Shell 会话中生效。


示例

假设有一个名为 config.sh 的脚本文件,内容如下:

#!/bin/bash
export MY_VAR="Hello, World!"
my_function() {
    echo "This is a function."
}


1、使用 ./config.sh 执行脚本:

./config.sh
echo $MY_VAR  # 输出为空,因为 MY_VAR 是在子 Shell 中定义的
my_function   # 命令未找到,因为 my_function 是在子 Shell 中定义的


2、使用 source config.sh 执行脚本:

source config.sh
echo $MY_VAR  # 输出:Hello, World!
my_function   # 输出:This is a function.


注意事项

1、当使用 source 命令执行脚本时,脚本中的任何错误都会在当前 Shell 会话中显示出来,这可能会影响到后续命令的执行。

2、source 命令通常用于配置文件或初始化脚本,以便在当前 Shell 会话中立即应用更改。

3、在某些情况下,使用 source 命令执行脚本可能会导致意外的副作用,特别是当脚本中包含对环境变量或别名进行修改的命令时。因此,在执行未知来源的脚本时,应谨慎使用 source 命令。