Bash 如何打印/回显环境变量?
如何打印刚刚设置的环境变量Bash 如何打印/回显环境变量?,bash,eval,Bash,Eval,如何打印刚刚设置的环境变量 NAME=sam echo "$NAME" # empty 您可以在这里使用eval查看它的工作原理。这是路吗 NAME=sam eval 'echo $NAME' # => sam 这些命令需要作为不同的命令执行,例如: NAME=sam; echo "$NAME" NAME=sam && echo "$NAME" 在运行echo之前,shell将$NAME扩展到空字符串,因此在NAME变量传递到echo命令的环境时,扩展已经完成(扩展到
NAME=sam echo "$NAME" # empty
您可以在这里使用eval
查看它的工作原理。这是路吗
NAME=sam eval 'echo $NAME' # => sam
这些命令需要作为不同的命令执行,例如:
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
在运行echo
之前,shell将$NAME
扩展到空字符串,因此在NAME
变量传递到echo
命令的环境时,扩展已经完成(扩展到空字符串)
要在一个命令中获得相同的结果,请执行以下操作:
NAME=sam printenv NAME
这也适用于分号
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。将现有答案与重要澄清结合起来: 如前所述,
NAME=sam echo“$NAME”
的问题是在赋值NAME=sam
生效之前,$NAME
被当前shell扩展
保留原始语义的解决方案(无效的解决方案尝试NAME=sam echo“$NAME”
):
使用eval
[1]
(与问题本身一样),或printenv
(由Aaron McDaid添加到),或bash-c
(从),按效率降序排列:
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上都可用
这种调用方式(=cmd…
)的作用是定义名称
:
- 作为环境变量
- 仅为被调用的命令定义。
NAME
只存在于被调用的命令中,对当前shell没有影响(如果之前不存在名为NAME
的变量,那么之后将没有变量;先前存在的NAME
变量保持不变)
POSIX在其章节中定义了此类调用的规则
以下解决方案的工作原理非常不同(从): 虽然它们产生相同的输出,但它们定义:
- 外壳变量
(仅限)而不是环境变量名称
- 如果
是一个依赖于环境变量echo
的命令,则不会对其进行定义(或可能与之前的定义不同)NAME
- 如果
- 命令发出后,将继续存在。
export
或declare-x
标记为环境变量)
[1] 从技术上讲,
bash
在这里违反了POSIX(正如zsh
):由于eval
是一个内置的特殊shell,前面的NAME=sam
赋值应该会导致变量$NAME
在命令完成后保留在范围内,但事实并非如此。但是,在POSIX兼容模式下运行
bash
时,它是兼容的。dash
和ksh
始终符合要求。确切的规则很复杂,有些方面要由实现来决定;再次请参见。
此外,通常的免责声明也适用:。
在windows上,您可以在CLI中使用此命令进行打印
C:\Users\dir\env|更多
您可以使用env命令查看系统上设置的所有环境变量。列表很长,因此通过管道将输出进行更多操作以使其更易于阅读。我添加了一个关于
printenv
的注释。希望没有问题,@heemayln注意,只有基于printenv
的命令保留了OP命令的语义:定义名称
作为命令范围的环境变量,只有被调用的命令及其子进程可以看到,但没有后续的shell命令。其他命令的作用非常不同:它们将NAME
定义为直到当前shell退出所有后续shell命令都可以看到的仅shell变量,但没有外部实用程序de>NAME=sam echo which不会更改shell中NAME
的值。
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"