如何打印/回显环境变量?
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
到空字符串的扩展是由 shell 早先完成的,在 运行 echo
之前,所以当时 NAME
变量是传递给 echo
命令的环境,扩展已经完成(到空字符串)。
要在一个命令中获得相同的结果:
NAME=sam printenv NAME
这也适用于分号。
NAME=sam; echo $NAME
语法
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。
将现有答案与重要说明结合起来:
如前所述,NAME=sam echo "$NAME"
的问题是 $NAME
被当前的 shell before 赋值扩展 NAME=sam
生效。
保留原始语义的解决方案((无效的)解决方案尝试NAME=sam echo "$NAME"
):
使用 eval
[1]
(如问题本身),或 printenv
(由 Aaron McDaid 添加到 ), or bash -c
(from ),按效率降序排列:
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
的变量,之后会有 none;先前存在的 NAME
变量保持不变。
POSIX 在其 Command Search and Execution 章节中定义了此类调用的规则。
以下解决方案的工作方式非常不同(引自):
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
虽然它们产生相同的输出,但它们定义:
- a shell 变量
NAME
(仅)而不是 environment变量
- 如果
echo
是依赖于 environment 变量 NAME
的命令,则它不会被定义(或可能与之前的定义不同)。
- 在命令后继续存在。
请注意,每个环境变量也作为 shell 变量公开,但反之则不然:shell 变量仅对当前 shell 及其子[可见=139=]s,但 not 到子进程,例如外部实用程序和(非源)脚本(除非 shell 变量也被指定为环境变量export
或 declare -x
).
[1] 从技术上讲,bash
在这里违反了 POSIX(zsh
):因为 eval
是 special shell 内置,前面的 NAME=sam
赋值应该导致变量 $NAME
在命令完成后保留在范围内,但事实并非如此.
但是,当您 运行 bash
处于 POSIX 兼容模式时,它 是 兼容的。
dash
和 ksh
始终合规。
确切的规则很复杂,有些方面留给实现来决定;再次参见 Command Search and Execution.
此外,通常的免责声明适用:Use eval
only on input you fully control or implicitly trust。
在 windows,您可以在 CLI 中使用此命令进行打印
C:\Users\dir\env | more
您可以使用 env 命令查看系统上设置的所有环境变量。列表很长,所以通过更多管道输出以使其更易于阅读。
如何打印刚刚设置的环境变量?
NAME=sam echo "$NAME" # empty
您可以在此处使用 eval
查看它是否有效。是这样吗?
NAME=sam eval 'echo $NAME' # => sam
这些需要作为不同的命令执行,例如:
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
$NAME
到空字符串的扩展是由 shell 早先完成的,在 运行 echo
之前,所以当时 NAME
变量是传递给 echo
命令的环境,扩展已经完成(到空字符串)。
要在一个命令中获得相同的结果:
NAME=sam printenv NAME
这也适用于分号。
NAME=sam; echo $NAME
语法
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。
将现有答案与重要说明结合起来:
如前所述,NAME=sam echo "$NAME"
的问题是 $NAME
被当前的 shell before 赋值扩展 NAME=sam
生效。
保留原始语义的解决方案((无效的)解决方案尝试NAME=sam echo "$NAME"
):
使用 eval
[1]
(如问题本身),或 printenv
(由 Aaron McDaid 添加到 bash -c
(from
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
的变量,之后会有 none;先前存在的 NAME
变量保持不变。
POSIX 在其 Command Search and Execution 章节中定义了此类调用的规则。
以下解决方案的工作方式非常不同(引自
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
虽然它们产生相同的输出,但它们定义:
- a shell 变量
NAME
(仅)而不是 environment变量- 如果
echo
是依赖于 environment 变量NAME
的命令,则它不会被定义(或可能与之前的定义不同)。
- 如果
- 在命令后继续存在。
请注意,每个环境变量也作为 shell 变量公开,但反之则不然:shell 变量仅对当前 shell 及其子[可见=139=]s,但 not 到子进程,例如外部实用程序和(非源)脚本(除非 shell 变量也被指定为环境变量export
或 declare -x
).
[1] 从技术上讲,bash
在这里违反了 POSIX(zsh
):因为 eval
是 special shell 内置,前面的 NAME=sam
赋值应该导致变量 $NAME
在命令完成后保留在范围内,但事实并非如此.
但是,当您 运行 bash
处于 POSIX 兼容模式时,它 是 兼容的。
dash
和 ksh
始终合规。
确切的规则很复杂,有些方面留给实现来决定;再次参见 Command Search and Execution.
此外,通常的免责声明适用:Use eval
only on input you fully control or implicitly trust。
在 windows,您可以在 CLI 中使用此命令进行打印
C:\Users\dir\env | more
您可以使用 env 命令查看系统上设置的所有环境变量。列表很长,所以通过更多管道输出以使其更易于阅读。