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
      的命令,则不会对其进行定义(或可能与之前的定义不同)
  • 命令发出后,将继续存在。
请注意,每个环境变量也作为shell变量公开,但相反的情况并非如此:shell变量仅对当前shell及其子shell可见,而对子进程(如外部实用程序和(非源代码的)脚本)不可见(除非它们用
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"