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 标准的脚本。

相关推荐
wdxylb30 分钟前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20072 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪2 小时前
关于Linux内核中头文件问题相关总结
linux
Lovyk4 小时前
Linux 正则表达式
linux·运维
Fireworkitte5 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9006 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char6 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘127 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
Techie峰9 小时前
常见的 Bash 命令及简单脚本
chrome·bash·excel
华强笔记11 小时前
Linux内存管理系统性总结
linux·运维·网络