如何打印/回显环境变量?

How to print / echo environment variables?

如何打印刚刚设置的环境变量?

NAME=sam echo "$NAME" # empty

您可以在此处使用 eval 查看它是否有效。是这样吗?

NAME=sam eval 'echo $NAME' # => sam

这些需要作为不同的命令执行,例如:

NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"

$NAME 到空字符串的扩展是由 shell 早先完成的,在 运行 echo 之前,所以当时 NAME 变量是传递给 echo 命令的环境,扩展已经完成(到空字符串)。

要在一个命令中获得相同的结果:

NAME=sam printenv NAME

这也适用于分号。

NAME=sam; echo $NAME

语法

variable=value command

常用于为特定进程设置环境变量。但是,您必须了解哪个进程获取什么变量以及谁解释它。例如,使用两个 shell:

a=5
# variable expansion by the current shell:
a=3 bash -c "echo $a"
# variable expansion by the second shell:
a=3 bash -c 'echo $a'

第一个回声的结果为 5,第二个回声的结果为 3。

将现有答案与重要说明结合起来:

如前所述,NAME=sam echo "$NAME" 的问题是 $NAME 被当前的 shell before 赋值扩展 NAME=sam生效。

保留原始语义的解决方案((无效的)解决方案尝试NAME=sam echo "$NAME"):

使用 eval[1] (如问题本身),或 printenv(由 Aaron McDaid 添加到 ), or bash -c (from ),按效率降序排列:

NAME=sam eval 'echo "$NAME"'  # use `eval` only if you fully control the command string
NAME=sam printenv NAME
NAME=sam bash -c 'echo "$NAME"'

printenv 不是 POSIX 实用程序,但它在 Linux 和 macOS/BSD 上都可用。

这种调用方式 (<var>=<name> cmd ...) 所做的是定义 NAME:

  • 作为环境变量
  • 仅为被调用的命令定义

也就是说:NAME只对被调用的命令(子进程)存在,对当前的shell没有影响(如果之前不存在名为 NAME 的变量,之后会有 none;先前存在的 NAME 变量保持不变。

POSIX 在其 Command Search and Execution 章节中定义了此类调用的规则。


以下解决方案的工作方式非常不同(引自):

NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"

虽然它们产生相同的输出,但它们定义:

  • a shell 变量 NAME (仅)而不是 environment变量
    • 如果 echo 是依赖于 environment 变量 NAME 的命令,则它不会被定义(或可能与之前的定义不同)。
  • 命令后继续存在。

请注意,每个环境变量也作为 shell 变量公开,但反之则不然:shell 变量仅对当前 shell 及其子[可见=139=]s,但 not 到子进程,例如外部实用程序和(非源)脚本(除非 shell 变量也被指定为环境变量exportdeclare -x).


[1] 从技术上讲,bash 在这里违反了 POSIX(zsh):因为 evalspecial shell 内置,前面的 NAME=sam 赋值应该导致变量 $NAME 在命令完成后保留在范围内,但事实并非如此.
但是,当您 运行 bash 处于 POSIX 兼容模式时,它 兼容的。
dashksh 始终合规。
确切的规则很复杂,有些方面留给实现来决定;再次参见 Command Search and Execution.
此外,通常的免责声明适用:Use eval only on input you fully control or implicitly trust

在 windows,您可以在 CLI 中使用此命令进行打印 C:\Users\dir\env | more

您可以使用 env 命令查看系统上设置的所有环境变量。列表很长,所以通过更多管道输出以使其更易于阅读。