对于 Bourne shell 系列,shell 变量都具有大写名称;这意味着您无法仅通过查看特定变量的名称来判断它是否是环境变量。如何确定哪些 Bourne shell 变量是本地变量(仅在当前 shell 中定义)?
答案1
最便携的方式是export -p
.
export -p
列出导出的变量。这通常就像declare -x
,如果你的外壳有declare
.
目前使用的 Bourne 风格的 shell 应该支持export -p
,因为它是POSIX 要求:
什么时候-p被指定,出口应按以下格式将所有导出变量的名称和值写入标准输出:
"export %s=%s\n", <name>, <value>
如果姓名已设置,并且:
"export %s\n", <name>
如果姓名未设置。
标准=
继续解释变量值的显示方式通常允许稍后在赋值的右侧使用它。这就是说它可以被引用。不同的 shell 可能显示不同,但效果相同。export -p
即使在没有declare
内置的外壳中也可以工作,例如短跑。
$ dash -c 'export -p | grep HOME=' # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME=' # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek
为了紧凑性,我已将输出通过管道传输grep
,但如果您不对其进行过滤,那么您将获得导出变量的完整列表。从你的问题来看,这听起来像是你可能发现最有用的。
某些 shell(如 Bash)使用非标准格式,除非明确指示以符合 POSIX 的方式运行。在 Bash 中export -p
给出与默认情况相同的输出declare -x
。
$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME=' # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"
即使启用了 POSIX 兼容性,Zsh 也会显示非标准格式:
$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
在任何情况下,您都可以通过搜索后跟 的单词来提取可移植表示形式(可能会被引用)=
。这不依赖于该行之前的单词,只要它们不紧接在 之前=
,而它们不应该出现在 之前。例如:
% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....
注意不是所有条目都必须有=
.这是因为变量可以取消设置但可以导出。这些条目被上面的命令过滤掉grep
,这可能是也可能不是您想要的。
大多数时候,您只想检查输出,因此您不会关心条目前面是否有export
、declare -x
、typeset -x
或其他内容。然后就跑吧export -p
。
我在 Ubuntu 16.04 LTS 上测试了这些命令官方打包版本每个外壳。
答案2
如果您想查看变量是否已导出,请使用declare
:
$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"
答案3
变量是不是导出可以从bash命令的输出中看到declare
。
变量是导出可以从bash 中的declare -x
或命令的输出中看到。export