当不带任何选项使用 set 命令时,它会显示所有 shell 变量和函数的名称和值。
我们只想显示变量并避免输出中的函数。
答案1
正如我在评论中已经指出的那样,env
不符合要求,因为它只显示导出的变量。
处理set
输出以过滤掉任何看起来不像变量定义的内容是一种不可靠的黑客行为。您尤其会错过部分值包含换行符的变量。更糟糕的是,精心编写的函数可能会出现虚假的变量定义。
最简单的解决方案是暂时切换到 POSIX 模式,其中函数不被视为(某种)变量:
set -o posix
set
set +o posix
但是,如果您的默认模式已经是 POSIX,或者您希望该命令在 shell 设置为的任何 POSIX 模式下工作,则会出现问题。
在这种情况下,有一个解决方法:
(set -o posix;set)
这只会为子 shell 中执行的内置命令设置 POSIX 模式set
,并且父 shell 模式不受影响。
答案2
虽然最简单的解决方案是使用env
而不是set
,env
却没有给出全部现有变量,但仅限那些将传递到启动的任何进程的变量env
(例如,没有未导出的变量)。另一种方法是搜索set
包含非空白字符串、an=
和另一个非空白字符字符串的行的输出:
set | grep -E '^\S+=\S'
但是,这将错过设置为多行值的任何变量(例如IFS
其默认值包括 a \n
)。
答案3
由于某些奇怪的原因,declare -p
似乎只列出变量:
$ declare -p
declare -x ANT_HOME="/usr/share/apache-ant"
declare -- BASH="/usr/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -A BASH_ALIASES=()
declare -a BASH_ARGC=()
declare -a BASH_ARGV=()
declare -A BASH_CMDS=()
...
当然,这有一个缺点,即它输出的declare
命令可以重新创建变量及其所有属性。根据您打算对输出执行的操作,这实际上可能很有用。
答案4
我不确定,但牛会考虑一些事情。
_____
( env )
-----
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
换句话说,直接使用env
即可。
我猜她刚刚读了 jilliagre 的评论。
________________________________
/ But it will only show exported \
\ variables! /
--------------------------------
\ ^__^
\ (!!)\_______
(__)\ )\/\
!! ||----w |
|| ||