source 与 .(点命令)
作用与特点
执行方式:
两者都用于在当前 shell 环境中执行指定脚本文件的命令,而不是启动一个新的子 shell。效果:
脚本中对环境变量、函数、当前目录等所做的修改会直接影响当前 shell 环境。这对于设置环境变量、加载配置等场景非常有用。语法区别:
source script.sh
是 Bash 及部分其他 shell 中的内置命令。. script.sh
(点命令)是 POSIX 标准规定的,在所有 POSIX 兼容的 shell 中都可用。在 Bash 中,二者完全等价。
示例说明
假设有一个脚本 setvar.sh
内容如下:
#!/bin/bash
export MYVAR="Hello from script"
echo "Inside script: MYVAR=$MYVAR"
使用 source 或 . 来执行:
source setvar.sh
# 或者
. setvar.sh
输出会显示:
Inside script: MYVAR=Hello from script
执行完毕后,在当前 shell 中运行 echo $MYVAR
,会得到:
Hello from script
环境变量 MYVAR
被设置在了当前 shell 中。
2. bash 与 sh
作用与特点
执行方式:
使用bash script.sh
或sh script.sh
会在新的子 shell中执行脚本。这意味着脚本中的所有更改(环境变量、目录变化等)仅在该子 shell 内有效,执行完毕后不会影响父 shell 环境。bash 与 sh 的区别:
bash script.sh:明确指定使用 Bash 解释器来运行脚本,支持 Bash 的扩展特性。
sh script.sh:使用系统默认的 POSIX shell。在 Ubuntu 上,通常
/bin/sh
指向 dash,一个比 Bash 更轻量、更快但功能较少的 shell。
如果脚本中使用了 Bash 专有的语法,使用sh
运行可能会出现错误。
示例说明
还是用前面的 setvar.sh
脚本,内容不变
使用 bash 来执行:
bash setvar.sh
输出会显示:
Inside script: MYVAR=Hello from script
但在执行完后,当前 shell 中输入:
echo $MYVAR
输出为空,因为 MYVAR
的定义仅在新启动的 Bash 子 shell 中有效。
使用 sh 来执行:
sh setvar.sh
- 效果与
bash setvar.sh
类似:脚本在新子 shell 中运行,环境变量仅在该进程内有效,执行完毕后不会影响父 shell。 - 如果脚本中有 Bash 扩展语法,使用
sh
可能会报错。
总结
source 或 .
适用场景: 加载环境配置文件(如 ROS 的
setup.bash
)、设置变量或函数,使其在当前 shell 中生效。注意: 使用这两个命令后,脚本内的所有改动都会保留在当前 shell 环境中。
bash 与 sh
适用场景: 执行需要独立运行的脚本程序,不希望污染当前 shell 环境。
注意: 脚本在子 shell 中执行完毕后,环境变量和状态不会传递给父 shell。并且在 Ubuntu 中,推荐使用
bash
来运行依赖 Bash 特性的脚本,而sh
则用于简单、兼容 POSIX 标准的脚本。