1. 执行方式
- sh script.sh 或 bash script.sh:
- 运行脚本时,创建一个新的子shell。
- 脚本中的命令在这个子shell中执行,任何在脚本中设置的环境变量或工作目录(如 cd)等变化将不会影响到父shell。
- 当脚本执行完毕,子shell会退出,返回到父shell。
- source ./script.sh 或 . ./script.sh:(source 命令其别名 .)
- 不会创建新的子shell,而是直接在当前shell环境中执行脚本。
- 脚本中的所有命令和变量设置都会影响到当前的shell环境,这意味着如果脚本中更改了环境变量,它们在当前shell中仍然有效。
- 脚本执行完后,控制仍然在当前shell中。
- ./script.sh:
- 直接执行脚本文件
script.sh
- 使用
./script.sh
方式执行脚本时,会在一个新的子Shell中运行脚本,但是此时脚本需要有执行权限,可以使用chmod +x script.sh
添加执行权限 - 运行此命令时,系统会根据
shebang
(#!)行来确定使用哪个解释器执行该脚本。例如,如果脚本的第一行是#!/bin/bash
,那么它会使用 Bash 来执行脚本。 - 可以直接执行任意可执行文件,例如
demo.py
或可执行二进制文件
- 直接执行脚本文件
2. 适用场景
- 使用 sh script.sh 或 bash script.sh 时:
- 适用于想要独立运行脚本且不需要与当前shell共享环境的情况。
- 运行的结果仅对脚本内部有效。
- 使用 . ./script.sh 或 source ./script.sh 时:
- 适用于需要在当前环境中共享变量或改变当前shell状态的情况。
- 很常用在设置环境变量、配置shell提示符或其他需要在当前shell生效的设置。
- ./script.sh:
- 根据脚本中的 shebang 行,可以选择不同的解释器执行文件 (如Bash、python2、python3 等)。
- 对于支持不同 shell 特性的脚本,使用 ./script.sh 更为灵活,也更能确保代码按照预期进行执行。
- 提升可读性和直接性
- 处理特定环境或上下文下的错误
3. 错误处理与返回值
- 子shell执行 (sh script.sh) :
- 如果脚本有错误,子shell会返回错误码,但父shell的环境状态不会改变。
- 当前shell执行 (. ./script.sh) :
- 错误会直接影响当前shell的状态,可以通过捕获错误来处理,比如使用条件语句。
4. 总结
- 使用
sh script.sh
或bash script.sh
或./script.sh
适合于独立执行、限制对当前环境的影响。 - 使用
. ./script.sh
或source ./script.sh
适合于需要在当前shell环境中载入设置、变量,或者希望脚本更改当前环境状态的场景。