启动 bash shell 进程时,除了启动文件中指定的环境变量之外,默认环境变量是什么?
某些 bash 或 sh 内置变量(列在《Bourne Shell 变量》和“Bash 变量”Bash 手册的部分)是默认环境变量,而其他 bash 或 sh 内置变量不是?哪些类型的 bash 或 sh 内置变量是默认环境变量?
在环境变量的 POSIX 定义看来 bash 中的所有或大部分内置变量默认都是环境变量,但我不确定。
答案1
正常情况下一个进程继承来自其父进程的环境变量。除非程序(例如 shell)有其他约定,否则不存在“默认”环境变量。
如果你好奇,你可以使用命令env -i
来清除环境并使用printenv
来显示环境。一些例子:
$ env -i printenv
$ env -i sh -c printenv
PWD=/home/peter
SHLVL=1
_=/usr/bin/printenv
$ echo printenv | env -i sh
PWD=/home/peter
SHLVL=1
_=/usr/bin/printenv
$ env -i sh --login -c printenv
...all kinds of variables from login scripts...
LANG=en_US.UTF-8
PWD=/home/peter
SHLVL=1
PATH=/usr/local/bin:/usr/bin:...
LESSOPEN=|/usr/bin/lesspipe.sh %s
_=/usr/bin/env
bash(1) 手册记录了其中一些变量,但不幸的是,它没有提供关于这些变量是否存在的明确答案。环境变量总是被设置或不被设置。
bash中的其他变量可以通过类似的方式找到:
$ env -i -c set
BASH=/usr/bin/sh
...
BASH_VERSION='4.4.5(1)-release'
...
SHLVL=1
TERM=dumb
UID=1000
_=sh
如果您需要依赖任何这些变量,最好检查bash手册。尤其:
现在假设您有一个打开的 bash shell。您想知道某个变量是否可用于子 shell。为此,declare -p NAME...
内置函数可用于“显示每个 NAME 的属性和值。示例:
$ declare -p PWD
declare -x PWD="/home/peter"
$ declare -p foo
bash: declare: foo: not found
$ foo=bar
$ declare -p foo
declare -- foo="bar"
该-x
属性将变量标记为出口这意味着子流程可以看到这个变量。要对现有变量执行此操作,您可以使用export
内置函数:
$ export foo
$ declare -p foo
declare -x foo="bar"
在 Bash 中,设置变量并使其可用于子进程可以组合起来:
$ export foo=bar