您如何确定是否导出外壳变量?


13

对于Bourne shell家族,shell变量都具有大写的大小写名称;这意味着您不能仅通过查看其名称来判断特定变量是否为环境变量。您如何确定哪些Bourne shell变量是局部的(仅在当前shell中定义)?


4
伯恩壳还是再次伯恩壳?您可以指向大写变量的参考吗?
杰夫·谢勒

在Bourne-again shell中,由于所有变量都是大写的,您如何确定哪些bash变量是局部的?
Shoulderpadz

7
@Shoulderpadz没有什么阻止您创建小写变量。
大师

1
本地,您是指尚未导出的变量吗?
伊莱亚·卡根

4
您要问的区别是外壳变量与环境变量,而不是全局变量与局部变量。请注意,有些shell变量不是环境变量(即您所说的“本地”),有些环境变量不是shell变量(环境可以包含不是有效的shell标识符的名称,因此不能是变量)。
chepner

Answers:


17

如果要查看是否导出变量,请使用declare

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

最可移植的方法是export -p

export -p列出导出的变量。这通常就像declare -x如果您的外壳有declare

当前使用的Bourne风格的shell应该支持POSIXexport -p要求的

当指定-p时export应该以以下格式将所有导出变量的名称和值写入标准输出:

"export %s=%s\n", <name>, <value>

如果设置了名称,并且:

"export %s\n", <name>

如果未设置名称

该标准继续说明,变量值的显示方式通常允许稍后在=赋值的右侧使用它。就是说可以引用它。不同的外壳可能显示不同,但效果相同。export -p即使在没有declare内置功能的Shell中也可以使用,例如Dash

$ 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,以使其更加紧凑,但是,如果您不对其进行过滤,则会获得导出变量的完整列表。从您的问题来看,这听起来可能是您最有用的。

除非明确指示以POSIX兼容的方式运行,否则某些Shell(例如Bash)使用非标准格式。在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上面的命令过滤掉了,可能不是您想要的。

大多数时候,你只是想检查输出,因此,如果条目由之前你不会在意exportdeclare -xtypeset -x,或别的东西。然后运行export -p

我在Ubuntu 16.04 LTS上使用每个shell的官方打包版本测试了这些命令。


0

被变量NOT出口可以从输出可以看出declare在bash命令。

的变量导出可以从输出中看到declare -xexport在bash命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.