终端标签是否对应不同的外壳?

bor*_*zzz 5 command-line bash environment-variables

我多年来一直在使用环境变量,但只阅读了有关环境变量与外壳变量的信息。根据定义:

  • 环境变量是“系统范围的”并由子 shell 和进程继承
  • Shell 变量仅在设置它们的 Shell 中有效

我正在阅读的这本书继续指出,使用export在您当前的环境(bash shell)中使用一个变量,并使其在任何环境中都可用,直到您再次更改它为止。

但是,如果我通过调用 更改环境变量(例如 HISTSIZE)export HISTZISE=999,然后检查不同终端选项卡 ( echo $HISTSIZE) 中的值,则更改不可见。如果更改应该是系统范围的,为什么会这样?我个人习惯于在打开新的终端选项卡时始终设置我的环境变量,并且我认为导出值不会影响其他选项卡(外壳?)。

所以我的问题是:不同的终端选项卡是否被视为不同的 shell 环境?那么“系统范围”是什么意思?

谢谢您的帮助!

muc*_*lux 7

export 将变量导出到当前 shell 的所有子级。

所以如果你这样做

somevariable=somevalue
export somevariable
bash 
echo $somevariable
Run Code Online (Sandbox Code Playgroud)

您将在这个新 shell 中看到 $somevariable 的值。

但是,其他终端选项卡中的 shell 不是第一个选项卡中 shell 的子级,因此它们不会继承导出的变量。

终端选项卡中的 shell 都是打开终端的 gnome 进程的子进程,因此它们是“兄弟姐妹”。您可以通过调用ps -f两个终端选项卡并查看 bash 行的列 PPID(父进程 ID)来验证这一点。在我的示例中,它们都有父进程 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
Run Code Online (Sandbox Code Playgroud)

选项卡 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
Run Code Online (Sandbox Code Playgroud)