ubuntu中source bash sh的区别

source 与 .(点命令)

作用与特点

  • 执行方式:

    两者都用于在当前 shell 环境中执行指定脚本文件的命令,而不是启动一个新的子 shell。

  • 效果:

    脚本中对环境变量、函数、当前目录等所做的修改会直接影响当前 shell 环境。这对于设置环境变量、加载配置等场景非常有用。

  • 语法区别:

    • source script.sh 是 Bash 及部分其他 shell 中的内置命令。

    • . script.sh(点命令)是 POSIX 标准规定的,在所有 POSIX 兼容的 shell 中都可用。在 Bash 中,二者完全等价。

示例说明

假设有一个脚本 setvar.sh 内容如下:

bash 复制代码
#!/bin/bash
export MYVAR="Hello from script"
echo "Inside script: MYVAR=$MYVAR"

使用 source 或 . 来执行:

bash 复制代码
source setvar.sh
# 或者
. setvar.sh

输出会显示:

bash 复制代码
Inside script: MYVAR=Hello from script

执行完毕后,在当前 shell 中运行 echo $MYVAR,会得到:

bash 复制代码
Hello from script

环境变量 MYVAR 被设置在了当前 shell 中。

2. bash 与 sh

作用与特点

  • 执行方式:

    使用 bash script.shsh 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 复制代码
bash setvar.sh

输出会显示:

bash 复制代码
Inside script: MYVAR=Hello from script

但在执行完后,当前 shell 中输入:

bash 复制代码
echo $MYVAR

输出为空,因为 MYVAR 的定义仅在新启动的 Bash 子 shell 中有效。

使用 sh 来执行:

bash 复制代码
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 标准的脚本。

相关推荐
NJCloud18 小时前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构
mounter62518 小时前
将 RDMA 引入容器:Soft-RoCE (RXE) 网络命名空间支持深度解析
linux·linux kernel·kernel·rdma·net namespace
奈斯先生Vector19 小时前
从 127.0.0.1:3080 到插件运行时:DeepSeek Harness 远程开发与版本治理实战
linux·运维·人工智能·ubuntu·aigc
wuminyu19 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
Android系统攻城狮19 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(七十八)
linux·运维·服务器·音频进阶·pipewire音频实战进阶
换个号退隐江湖i20 小时前
LLM 调试日志刷屏怎么办?用 tee 边看边存
linux
DYWorker00121 小时前
搭建嵌入式Linux虚拟机开发环境
linux
weipt21 小时前
从ollama到llama.cpp
linux·服务器·llama
加油码21 小时前
动静态库的链接底层原理(进阶版)
linux·c++
H_oRIZoN_1 天前
Linux入门DAY23(C语言树形结构)
linux·c语言·数据结构