[英]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"
虽然它们产生相同的输出,但它们定义了:
NAME
(仅)而不是环境变量
echo
是一个依赖于环境变量NAME
的命令,那么它就不会被定义(或者可能与之前的定义不同)。 请注意,每个环境变量也作为 shell 变量公开,但反之则不然:shell 变量仅对当前 shell 及其子 shell 可见,而对子进程(例如外部实用程序和(非源)脚本)不可见(除非它们被标记为带有export
或declare -x
环境变量)。
[1] 从技术上讲, bash
在这里违反了 POSIX(就像zsh
):由于eval
是一个特殊的内置 shell,因此前面的NAME=sam
赋值应该导致变量$NAME
在命令完成后保留在作用域中,但事实并非如此。
但是,当您在 POSIX 兼容模式下运行bash
时,它是兼容的。
dash
和ksh
始终兼容。
确切的规则很复杂,有些方面由实现来决定; 再次,请参阅命令搜索和执行。
此外,通常的免责声明适用:仅对您完全控制或隐含信任的输入使用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.