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

时间:2016-10-14 19:35:49

标签: bash eval

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

NAME=sam echo "$NAME" # empty

您可以使用eval在此处查看。是这样的吗?

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

5 个答案:

答案 0 :(得分:42)

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

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

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

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

NAME=sam printenv NAME

答案 1 :(得分:4)

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

如上所述,NAME=sam echo "$NAME"的问题是,在分配$NAME生效之前,NAME=sam会被当前的shell 扩展。

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

使用eval [1]  (如问题本身所示),或printenv(由Aaron McDaid添加到heemayl's answer)或bash -c(来自Ljm Dullaart's answer),按效率降序排列:< / p>

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的变量,则会之后没有;先前存在的NAME变量保持不变。

POSIX在Command Search and Execution章节中定义了这种调用的规则。

以下解决方案的工作方式非常不同(来自heemayl's answer):

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

虽然他们生成相同的输出,但他们改为定义:

  • shell 变量NAME (仅限)而非环境变量
    • 如果echo是依赖 environment 变量NAME的命令,则不会定义(或者可能与之前的定义不同)。
  • 命令后 依赖

请注意,每个环境变量也作为shell变量公开,但反之则不正确:shell变量仅对当前shell及其子shell可见,但对子进程可见,例如作为外部实用程序和(非源代码)脚本(除非它们被exportdeclare -x标记为环境变量。

[1]从技术上讲,bash违反了POSIX(与zsh一样):由于eval特殊 shell构建的-in,前面的NAME=sam赋值应该导致变量$NAME在命令完成后保留在范围内,但这不会发生什么。
但是,在POSIX兼容模式下运行bash时,符合 dashksh始终符合要求 确切的规则很复杂,有些方面需要由实现来决定;再次,请参阅Command Search and Execution 此外,通常的免责声明适用:Use eval only on input you fully control or implicitly trust。 功能

答案 2 :(得分:2)

这也适用于分号。

NAME=sam; echo $NAME

答案 3 :(得分:2)

语法

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。

答案 4 :(得分:0)

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

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