我已经使用环境变量很久了,但刚刚才读到关于环境变量与 Shell 变量的文章。根据定义:
- 环境变量是“系统范围的”,并由子 shell 和进程继承
- Shell 变量仅在设置它们的 shell 中有效
我正在读的书继续指出,使用出口在您当前环境(bash shell)中获取一个变量并使其在任何环境中可用,直到您再次更改它。
但是,如果我通过调用 更改环境变量(例如 HISTSIZE)export HISTZISE=999
,然后在不同的终端选项卡(echo $HISTSIZE
)中检查该值,则更改不可见。如果更改应该是系统范围的,为什么会这样?就我个人而言,我习惯于在打开新的终端选项卡时始终设置环境变量,并且我理所当然地认为导出值不会影响其他选项卡(shell?)。
所以我的问题是:不同的终端选项卡是否被视为不同的 shell 环境?那么“系统范围”是什么意思?
谢谢您的帮助!
答案1
export
将变量导出到当前 shell 的所有子 shell。
所以如果你
somevariable=somevalue
export somevariable
bash
echo $somevariable
您将在这个新的 shell 中看到 $somevariable 的值。
但是其他终端选项卡中的 shell 不是第一个选项卡中的 shell 的子项,因此它们不会继承导出的变量。
终端选项卡中的 shell 都是打开终端的 gnome 进程的子进程,因此它们是“兄弟姐妹”。您可以通过调用ps -f
两个终端选项卡并查看 bash 行的 PPID(父进程 ID)列来验证这一点。在我的示例中,两个 shell 的父进程均为 5319,即 gnome 终端进程。
标签 1:
$ ps -f
UID PID PPID C STIME TTY TIME CMD
jean 5329 5319 0 10:36 pts/0 00:00:00 bash
jean 5359 5329 0 10:37 pts/0 00:00:00 ps -f
标签 2:
$ ps -f
UID PID PPID C STIME TTY TIME CMD
jean 5363 5319 0 10:37 pts/1 00:00:00 bash
jean 5372 5363 0 10:37 pts/1 00:00:00 ps -f
$ ps -f -p5319
UID PID PPID C STIME TTY TIME CMD
jean 5319 2299 0 10:36 ? 00:00:02 /usr/lib/gnome-terminal/gnome-t