linux的source命令
source是Linux/Unix系统中的一个内置shell命令,用于在当前shell环境中执行指定的脚本文件,而不是在子shell中执行。这个命令对于修改当前shell环境变量特别有用。
基本语法
1source filename [arguments]
或者使用简写形式:
1. filename [arguments]
主要功能
-
在当前shell环境中执行脚本:与直接运行脚本(
./script.sh)不同,source不会创建新的子shell进程 -
加载环境变量:常用于加载配置文件,如
.bashrc、.profile等 -
执行函数定义:可以加载包含函数定义的脚本文件
常见应用场景
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 |
注意事项
-
使用
source时要确保脚本来源可信,因为它会在当前环境中执行所有命令 -
脚本中的
exit命令会直接退出当前shell会话 -
如果脚本中有修改当前目录的命令(
cd),会影响当前shell的工作目录 -
某些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别名了