我认为这是一个非常简单的问题:使用 $HOSTNAME 和 `hostname` 等环境变量之间的主要区别是什么。哪个合适,为什么有两种可能性来代表它们?
答案1
依赖于获取当前值的命令比依赖于在无人值守会话中一段时间后可能变得陈旧的变量更合适。
[centos@abc ~]$ /bin/hostname
abc.dns.com
[centos@abc ~]$ echo $HOSTNAME
abc.dns.com
[centos@abc ~]$ uname -n
abc.dns.com
[centos@abc ~]$ sudo /bin/hostname xyz.dns.coom
[centos@abc ~]$ uname -n
xyz.dns.coom
[centos@abc ~]$ /bin/hostname
xyz.dns.coom
[centos@abc ~]$ echo $HOSTNAME
abc.dns.com
[centos@abc ~]$
我认为很明显这是一个 shell 变量,它是通过捕获shell 初始化开始时$HOSTNAME
的输出来扩展/评估的,并且它不会每次更新或者主机名是动态的。/bin/hostname
取决于 的输出/bin/hostname
比 $HOSTNAME 更可靠,除非它是已在同一程序空间中评估主机名称的同一脚本或程序。
嗯,简而言之,命令的输出/bin/hostname
或者/bin/uname -m
是比仅使用 $HOSTNAME 更合适的方法来了解主机名(它可能会像任何其他正常的 SHELL 变量一样变得过时)。
如果您想知道 shell 如何继承 $HOSTNAME,那么应该知道 shell 读取其全局初始化 (rc) 文件,如 /etc/profile(或 /etc/bashrc),该文件再次从输出定义了此变量/bin/hostname
。
(同样重要的是要知道,除了 shell 之外,没有事先执行/bin/hostname
命令的程序可以定义/初始化 HOSTNAME 变量,因为系统启动脚本称为/etc/rc.sysinit
)
答案2
环境变量设置一劳永逸(对于给定进程;当一个进程启动另一个进程时,子进程继承父进程的环境)。所以访问$HOSTNAME
直接读取内存中的值。相反,每次评估命令替换`hostname`
(也拼写为$(hostname)
)时,都会执行该hostname
命令。
$HOSTNAME
在和的情况下hostname
,实际上没有任何区别。$HOSTNAME
稍微快一些。原则上,$HOSTNAME
如果您已经运行,则可能是错误的HOSTNAME=some_bogus_value
(而如果您在您的 上放置了一些不同的程序,$(hostname)
则可能是错误的),并且只有在更改主机名时才保持最新。hostname
$PATH
hostname
经常(但并非总是)有一个HOSTNAME
环境变量,因为它经常被使用(例如在 shell 提示符中)并且几乎从不改变。有一个命令(在大多数系统上)可以设置( )hostname
的值并更改主机名(通常在引导过程的早期完成)。HOSTNAME
HOSTNAME=$(hostname)
hostname $(cat /etc/hostname)