![Linux 上的 HOSTNAME 环境变量](https://linux22.com/image/1236781/Linux%20%E4%B8%8A%E7%9A%84%20HOSTNAME%20%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png)
在我的 Linux 机器上(具体来说是 Gentoo Linux 2.6.31),我注意到 HOSTNAME 环境变量在我的 shell 中可用,但在脚本中不可用。例如,
$ echo $HOSTNAME
返回
xxxxxxxx.com,
但
$ ruby -e 'puts ENV["HOSTNAME"]'
返回
nil
另一方面,例如,USER 环境变量在 shell 和脚本中都可用。
我注意到当我输入时出现的环境变量列表中出现了 USER
export
IE,
declare -x USER="infogrind"
但 HOSTNAME 没有。我怀疑问题与此有关。
我的问题:1)如何使 HOSTNAME 在脚本中可用,2)为了更好地理解,这个变量最初在哪里设置,为什么它没有“导出”?
答案1
$HOSTNAME
是自动设置的 Bash 变量(而不是在启动文件中)。Ruby 可能sh
为其 shell 运行,并且不包含该变量。您没有理由不能自己导出它。
bash$ echo $HOSTNAME
foobar
bash$ sh -c 'echo $HOSTNAME'
bash$ export HOSTNAME
bash$ sh -c 'echo $HOSTNAME'
foobar
您可以将导出命令添加到您的某个启动文件中,例如~/.bashrc
。
在 Ruby 中(显示 irb):
>> require 'socket'
=> true
>> Socket.gethostname
=> "bazinga"
答案2
准确地说,HOSTNAME
它是一个 Bash 变量,但它不是 Bash环境变量(即没有传入环境到子进程)。可以通过查看env
输出来检查这一点:
/tmp$ echo $BASH_VERSION
5.2.21(1)-release
/tmp$ echo $HOSTNAME
wheleph-mbp.local
/tmp$ env | grep HOSTNAME
/tmp$
ENV["HOSTNAME"]
读环境传递给 Ruby 解释器,因此无法HOSTNAME
在那里找到。