Bash 似乎区分已导出的变量和未导出的变量。
例子:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
Run Code Online (Sandbox Code Playgroud)
set
看到变量但env
没有。
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
Run Code Online (Sandbox Code Playgroud)
set
看到两个变量,但env
只看到导出的变量。
我知道这set
是一个内置的 bash 而env
不是。
导出的变量和不导出的变量之间有什么区别?
我刚遇到一个问题,显示我不清楚 shell 变量的范围。
我试图使用bundle install
,这是一个 Ruby 命令,它使用 的值$GEM_HOME
来完成其工作。我已经设置了$GEM_HOME
,但是在我使用之前,该命令忽略了该值export
,如export GEM_HOME=/some/path
.
我读到这使变量以某种方式“全局”(也称为环境变量),但我不明白这意味着什么。我了解编程中的全局变量,但不了解不同的程序。
此外,鉴于我设置的此类变量仅适用于当前的 shell 会话,我将如何为守护进程设置它们?
shell 变量可以有哪些作用域?
最近我注意到我们有 3 个选项来设置环境变量:
export envVar1=1
setenv envVar2=2
env envVAr3=3
如果有其他方法,请赐教。
我什么时候应该更喜欢一个?请提出指导方针。
至于 shell 兼容性,哪个是最广泛的(涵盖更多的 shell 方言)?
我已经注意到这个答案,但我想用env
使用偏好指南来扩展这个问题。
在 Bash 中键入以下内容:
env | grep USER
Run Code Online (Sandbox Code Playgroud)
和
set | grep USER
Run Code Online (Sandbox Code Playgroud)
给两次相同的用户名。
我怎么知道,例如在输入时echo $USER
是否显示了 shell 或环境变量?
env
并且printenv
都是外部命令,即可执行文件,而不是 bash 内置命令。它们的问题_
在于它们输出的一些环境变量(例如,我也想知道是否还有更多)不属于调用它们的 shell,请参见此处。