对于Bourne shell家族,shell变量都具有大写的大小写名称;这意味着您不能仅通过查看其名称来判断特定变量是否为环境变量。您如何确定哪些Bourne shell变量是局部的(仅在当前shell中定义)?
对于Bourne shell家族,shell变量都具有大写的大小写名称;这意味着您不能仅通过查看其名称来判断特定变量是否为环境变量。您如何确定哪些Bourne shell变量是局部的(仅在当前shell中定义)?
Answers:
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上面的命令过滤掉了,可能不是您想要的。
大多数时候,你只是想检查输出,因此,如果条目由之前你不会在意export,declare -x,typeset -x,或别的东西。然后运行export -p。
我在Ubuntu 16.04 LTS上使用每个shell的官方打包版本测试了这些命令。