Unix/Linux中的 dot 命令(.)是一个内置的Shell命令,用于在当前Shell环境中执行脚本。
. filename [arguments]
或(等价写法)
source filename [arguments]
与直接执行脚本(./script.sh)不同,点命令不会创建子进程:
cd命令会改变当前工作目录/),Shell会在$PATH中查找./开头,则使用当前目录的文件../config.sh)和绝对路径也可用# 重新加载bash配置文件
. ~/.bashrc
source ~/.bash_profile
# 加载环境变量
. /etc/profile
. env.sh
# myfuncs.sh 内容:
myfunc() {
echo "Hello $1"
}
alias ll='ls -la'
# 加载后可直接使用
. myfuncs.sh
myfunc "World" # 输出: Hello World
ll # 执行 ls -la
# config.sh 内容:
export JAVA_HOME=/usr/lib/jvm/java-11
export PATH="$JAVA_HOME/bin:$PATH"
# 加载到当前Shell
. config.sh
echo $JAVA_HOME # 输出: /usr/lib/jvm/java-11
| 特性 | . script.sh |
./script.sh 或 bash script.sh |
|---|---|---|
| 执行环境 | 当前Shell | 新建子Shell |
| 环境变量 | 影响当前Shell | 不影响当前Shell |
cd命令 |
改变当前目录 | 不影响当前目录 |
| 退出状态 | 最后执行的命令的退出码 | 脚本的退出码 |
| 需要的权限 | 只需要读权限 | 需要读和执行权限 |
# 创建 testenv.sh
echo 'export MY_VAR="test value"' > testenv.sh
# 方法1:点命令(变量保留)
. testenv.sh
echo $MY_VAR # 输出: test value
# 方法2:子进程执行(变量不保留)
bash testenv.sh
echo $MY_VAR # 输出: (空或之前的值)
# createdir.sh 内容:
mkdir -p /tmp/testdir
cd /tmp/testdir
pwd
# 使用点命令
. createdir.sh # 输出: /tmp/testdir
pwd # 输出: /tmp/testdir (目录已改变)
# 使用子进程执行
bash createdir.sh # 输出: /tmp/testdir
pwd # 输出: 原目录(未改变)
$1、$2等访问
set -e等设置仅影响脚本执行
Q: . 和 source 有什么区别?
A: 在bash中完全相同,source是.的同义词。但某些Shell(如dash)可能不支持source。
Q: 如何检查脚本是否被点命令执行?
A: 可以检查$0变量:
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
echo "直接执行"
else
echo "被source/.执行"
fi
Q: 点命令执行的脚本需要执行权限吗? A: 不需要,只需要读权限。因为Shell直接读取并解释文件内容。
这个命令在Shell编程和系统管理中非常有用,特别是在设置开发环境、管理配置等方面。