$ENV_VAR 和 `env_var` 之间的主要区别是什么?

$ENV_VAR 和 `env_var` 之间的主要区别是什么?

我认为这是一个非常简单的问题:使用 $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$PATHhostname

经常(但并非总是)有一个HOSTNAME环境变量,因为它经常被使用(例如在 shell 提示符中)并且几乎从不改变。有一个命令(在大多数系统上)可以设置( )hostname的值并更改主机名(通常在引导过程的早期完成)。HOSTNAMEHOSTNAME=$(hostname)hostname $(cat /etc/hostname)

相关内容