繁体   English   中英

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

[英]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扩展$NAME空字符串是由 shell 在运行echo之前完成的,因此在将NAME变量传递给echo命令的环境时,扩展已经完成(到空字符串)。

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

NAME=sam printenv NAME

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

如前所述, NAME=sam echo "$NAME"$NAME赋值NAME=sam生效之前被当前 shell 扩展。

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

使用eval [1] (如问题本身)或printenv (由 Aaron McDaid 添加到heemayl 的答案)或bash -c (来自Ljm Dullaart 的答案),按效率降序排列:

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 在其命令搜索和执行章节中定义了这种调用的规则。


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

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

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

  • shell变量NAME (仅)而不是环境变量
    • 如果echo是一个依赖于环境变量NAME的命令,那么它就不会被定义(或者可能与之前的定义不同)。
  • 住在命令后。

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


[1] 从技术上讲, bash在这里违反了 POSIX(就像zsh ):由于eval是一个特殊的内置 shell,因此前面的NAME=sam赋值应该导致变量$NAME在命令完成后保留在作用域中,但事实并非如此。
但是,当您在 POSIX 兼容模式下运行bash时,它兼容的。
dashksh始终兼容。
确切的规则很复杂,有些方面由实现来决定; 再次,请参阅命令搜索和执行
此外,通常的免责声明适用:仅对您完全控制或隐含信任的输入使用eval

这也适用于分号。

NAME=sam; echo $NAME

语法

variable=value command

通常用于为特定进程设置环境变量。 但是,您必须了解哪个过程获得了哪些变量以及由谁来解释它。 例如,使用两个外壳:

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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM