linux的source命令

source是Linux/Unix系统中的一个内置shell命令,用于在当前shell环境中执行指定的脚本文件,而不是在子shell中执行。这个命令对于修改当前shell环境变量特别有用。

基本语法

1source filename [arguments]

或者使用简写形式:

1. filename [arguments]

主要功能

  1. 在当前shell环境中执行脚本:与直接运行脚本(./script.sh)不同,source不会创建新的子shell进程

  2. 加载环境变量:常用于加载配置文件,如.bashrc.profile

  3. 执行函数定义:可以加载包含函数定义的脚本文件

常见应用场景

1. 重新加载配置文件

修改.bashrc.bash_profile后,不需要重新登录就能使更改生效:

1source ~/.bashrc

2. 设置环境变量

假设有一个env.sh文件包含:

1export PATH=$PATH:/custom/path
2export JAVA_HOME=/usr/lib/jvm/java-11-openjdk

使用source加载:

1source env.sh

这样环境变量会立即在当前shell中生效

3. 加载函数库

如果有一个函数库文件functions.sh

1function greet() {
2    echo "Hello, $1!"
3}

加载后可以直接使用:

1source functions.sh
2greet "World"  # 输出: Hello, World!

与直接执行脚本的区别

特性source命令直接执行脚本(./script.sh)
执行环境当前shell新的子shell
环境变量会保留不会影响当前shell
进程ID与当前shell相同创建新的进程
脚本中的exit会退出当前shell只退出子shell

注意事项

  1. 使用source时要确保脚本来源可信,因为它会在当前环境中执行所有命令

  2. 脚本中的exit命令会直接退出当前shell会话

  3. 如果脚本中有修改当前目录的命令(cd),会影响当前shell的工作目录

  4. 某些shell(如zsh)可能对source命令有细微的行为差异

实际例子

假设有一个project_env.sh文件:

1#!/bin/bash
2export PROJECT_HOME=/home/user/project
3export PATH=$PATH:$PROJECT_HOME/bin
4alias proj="cd $PROJECT_HOME && ls"

加载这个环境配置:

1source project_env.sh

之后就可以直接使用$PROJECT_HOME变量和proj别名了