如何使用最少数量的已定义变量获得 shell 会话(与所有功能一致)

如何使用最少数量的已定义变量获得 shell 会话(与所有功能一致)

我知道

/usr/bin/env -i /bin/bash --login --norc --noprofile

事实上,如果我运行上面的命令,并且printenv在新的 shell 会话中运行后立即,我会看到很少出口变量定义:

% /usr/bin/env -i /bin/bash --login --norc --noprofile
bash-4.4$ printenv | /usr/bin/perl -lpe 's/=.*//'
PWD
SHLVL
_
bash-4.4$ 

但如果我运行set,我会看到很多变量:

bash-4.4$ set | /usr/bin/perl -lpe 's/=.*//'
BASH
BASHOPTS
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_LINENO
BASH_SOURCE
BASH_VERSINFO
BASH_VERSION
COLUMNS
DIRSTACK
EUID
GROUPS
HISTFILE
HISTFILESIZE
HISTSIZE
HOSTNAME
HOSTTYPE
IFS
LINES
MACHTYPE
MAILCHECK
OPTERR
OPTIND
OSTYPE
PATH
PPID
PS1
PS2
PS4
PWD
SHELL
SHELLOPTS
SHLVL
TERM
UID
_
bash-4.4$ 

为了这个问题,让我定义一个 shell 变量是“不可或缺的”,除非该变量存在(如它在的输出bash中显示的那样),否则根本不会运行。set例如,PPID看起来是不可或缺的。 (bash如果有人尝试这样做,则会发出错误unset。)

减少已定义变量集以仅保存不可或缺的变量的最简单方法是什么?

答案1

set当您在“干净”的 shell 中运行时输出的每一个 shell 变量(没有通过继承设置的环境变量,也没有读取 shell 启动文件)是由 shell 本身设置的。它们也记录在bash(1)手册中 ( man bash)。

例如,该PPID变量记录为

shell 父进程的进程 ID。该变量是只读的。

其中一些,例如PPID,无法更改或取消设置。其他变量,例如SECONDS可以取消设置和更改(如果完成此操作,则该变量不再是“特殊”)。

由于默认情况下不会导出这些 shell 变量,因此子进程不会继承它们。因此,实际上不需要对这些变量进行任何形式的“清理”。

相关内容