问题:在不同的账户终端上或者子shell使用变量,思考变量的有效范围,并查阅环境变量是如何在不同的shell下继承的?
1. 变量的有效范围
变量在 shell 中的有效范围主要分为两种:局部变量和环境变量。
-
局部变量:
- 只在定义它的当前 shell 或子 shell 中有效。
- 例如,使用
var=value
定义的变量是局部的,无法在子 shell 或其他终端中访问。
-
环境变量:
- 可以被子 shell 和其他进程继承。
- 通过
export
命令可以将局部变量转换为环境变量,例如:
var=value
export var
- 现在,
var
在当前 shell 及其所有子 shell 中都可用。
2. Shell 变量的作用域示例
-
局部变量示例:
# 在当前 shell 中定义一个局部变量
my_var="Hello"
echo $my_var # 输出 Hello
# 启动一个子 shell
(
echo $my_var # 仍然输出 Hello
my_var="World" # 在子 shell 中修改
echo $my_var # 输出 World
)
# 返回到父 shell,my_var 仍然是 Hello
echo $my_var # 输出 Hello
环境变量示例:
# 在当前 shell 中定义并导出环境变量
my_env_var="Hello"
export my_env_var
# 启动一个子 shell
(
echo $my_env_var # 输出 Hello
my_env_var="World" # 修改环境变量
echo $my_env_var # 输出 World
)
# 返回到父 shell
echo $my_env_var # 仍然输出 Hello,因为父 shell 的环境变量未被修改
3. 环境变量的继承机制
当启动新的 shell 时,环境变量会被继承。具体流程如下:
-
登录 Shell:当你通过登录(例如 SSH 或打开一个终端)进入系统时,系统会读取
/etc/profile
或用户主目录下的~/.bash_profile
等配置文件,这些文件中定义的环境变量会被设置为当前 shell 的环境变量。 -
非登录 Shell:当你在一个已经打开的 shell 中启动新的 shell(例如通过输入
bash
或sh
)时,该新 shell 会继承当前 shell 的所有环境变量。 -
子 Shell:无论是通过脚本还是在命令行中创建子 shell,环境变量都会被传递给子 shell。
-
环境变量与局部变量的区别:
- 环境变量是从父进程传递给子进程的,而局部变量只在当前 shell 会话中可用,不会传递给子进程。
4. 查阅和管理环境变量
-
查看环境变量:使用
printenv
或env
命令可以列出当前所有的环境变量 -
查看特定变量:可以使用
echo
命令查看特定变量的值:
echo $MY_ENV_VAR
-
删除环境变量:可以使用
unset
命令删除某个变量:unset MY_ENV_VAR
总结
- 变量的有效范围在当前 shell、子 shell 和进程之间是不同的。局部变量只能在定义它的 shell 中使用,而环境变量可以在子 shell 和新进程中访问。
- 环境变量的设置和继承机制确保了在不同 shell 会话中变量的传递,理解这些概念对于脚本编写和系统管理至关重要。