我知道
/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 变量,因此子进程不会继承它们。因此,实际上不需要对这些变量进行任何形式的“清理”。