执行 Shell 脚本时,其作用范围(即变量、环境设置等)取决于你如何执行该脚本。具体来说,Shell 脚本的作用范围可以是当前会话有效或全局有效,取决于脚本的执行方式。
1. 当前 Session 有效(默认)
如果你在一个普通的 Shell 中执行脚本(例如,./script.sh
或 bash script.sh
),脚本中的变量和环境更改只会影响当前 Shell 会话(即当前终端窗口或进程)。这些修改不会传播到父 Shell 或其他会话中。
例如:
# 在 script.sh 中
#!/bin/bash
export MY_VAR="Hello World"
echo "MY_VAR inside script: $MY_VAR"
- 执行方法:
bash script.sh
- 结果:
MY_VAR
只在script.sh
内部有效,执行完脚本后,MY_VAR
不会影响当前 Shell 会话。
2. 全局有效(当前会话和父 Shell)
如果你希望脚本中的变量或环境设置能够影响父 Shell 或者整个当前会话,需要使用 source
命令或 .
(点命令)来执行脚本。
使用 source
或 .
执行脚本
source script.sh
或. script.sh
这两种方式会在当前 Shell 环境中执行脚本,而不是启动一个新的子进程。这意味着脚本中的变量、函数、环境设置等都会影响当前的 Shell 会话。
例如:
# 在 script.sh 中
#!/bin/bash
export MY_VAR="Hello World"
echo "MY_VAR inside script: $MY_VAR"
- 执行方法:
source script.sh
或. script.sh
- 结果:
MY_VAR
变量会在脚本执行后继续保留,并且可以在当前 Shell 会话中访问。
3. 区别总结
执行方式 | 是否影响当前 Shell 会话 | 是否影响父 Shell 会话 |
---|---|---|
./script.sh | 否(会在新进程中执行) | 否 |
bash script.sh | 否(会在新进程中执行) | 否 |
source script.sh | 是(在当前进程中执行) | 是 |
. script.sh | 是(在当前进程中执行) | 是 |
4. 实际应用场景
-
如果你只需要执行一些计算、打印信息或者临时修改变量,并且不需要这些更改影响到当前会话,使用
./script.sh
或bash script.sh
就可以了。 -
如果你需要通过脚本设置环境变量、定义函数或者修改当前会话中的配置,使用
source
或.
来执行脚本。
5. 注意:
- 环境变量的作用范围:通过
source
执行脚本时,脚本修改的环境变量会保留在当前 Shell 会话中,直到你关闭终端或手动修改它们。 - 退出子 Shell:如果脚本使用
bash script.sh
执行,它会在一个新的子 Shell 中运行,执行完毕后这个子 Shell 会退出,因此对环境变量的更改不会对父 Shell 产生影响。
希望这个解释能够清楚地帮助你理解两种执行方式的差异!