如何打印刚刚设置的环境变量?
NAME=sam echo "$NAME" # empty
您可以使用eval
在此处查看。是这样的吗?
NAME=sam eval 'echo $NAME' # => sam
答案 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"
虽然他们生成相同的输出,但他们改为定义:
NAME
(仅限)而非环境变量
echo
是依赖 environment 变量NAME
的命令,则不会定义(或者可能与之前的定义不同)。请注意,每个环境变量也作为shell变量公开,但反之则不正确:shell变量仅对当前shell及其子shell可见,但不对子进程可见,例如作为外部实用程序和(非源代码)脚本(除非它们被export
或declare -x
标记为环境变量。
[1]从技术上讲,bash
违反了POSIX(与zsh
一样):由于eval
是特殊 shell构建的-in,前面的NAME=sam
赋值应该导致变量$NAME
在命令完成后保留在范围内,但这不会发生什么。
但是,在POSIX兼容模式下运行bash
时,符合
dash
和ksh
始终符合要求
确切的规则很复杂,有些方面需要由实现来决定;再次,请参阅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 命令查看系统上设置的所有环境变量。列表很长,因此请通过更多管道输出以使其更易于阅读。