🏢
bashのHOSTNAME変数の値
概要
bash を起動したとき、~/.bashrcなどで明示的に設定していないのに自動的に設定されている変数がいくつかあるが、そのうちHOSTNAME変数について値の由来を見る。
bash の実装
bash のソースコードは https://git.savannah.gnu.org/cgit/bash.git/ で見れる。
set_machine_vars()関数において、HOSTNAME変数がなければcurrent_host_nameの値を設定するよう実装されている。
bash/variables.c
/* **************************************************************** */
/* */
/* Setting values for special shell variables */
/* */
/* **************************************************************** */
static void
set_machine_vars ()
{
SHELL_VAR *temp_var;
temp_var = set_if_not ("HOSTTYPE", HOSTTYPE);
temp_var = set_if_not ("OSTYPE", OSTYPE);
temp_var = set_if_not ("MACHTYPE", MACHTYPE);
temp_var = set_if_not ("HOSTNAME", current_host_name);
}
current_host_nameにはgethostname()関数で取得した値が設定されている。
bash/shell.c
/* It's highly unlikely that this will change. */
if (current_host_name == 0)
{
/* Initialize current_host_name. */
if (gethostname (hostname, 255) < 0)
current_host_name = "??host??";
else
current_host_name = savestring (hostname);
}
Linuxだとconfig.hにて
#define HAVE_GETHOSTNAME 1
#define HAVE_UNAME 1
となるので、結局glibcのgethostname()を呼んで得られた値がHOSTNAME変数に設定されているとわかる。
hostname
一方で、Debian/Ubuntuのhostnameコマンドのソース
を確認すると、オプションなしで実行した時の処理は main() → show_name() → localhost() → gethostname() という流れでこちらもglibcのgethostname()を呼んで得られた値を出力しているとわかる。したがって、bashのHOSTNAME変数の値はオプションなしの
$ hostname
の出力と等しい。
uname
glibcのgethostname()関数についてもう少し見る。マニュアルによれば
gethostname(2)
The GNU C library does not employ the gethostname() system call; instead, it implements
gethostname() as a library function that calls uname(2) and copies up to len bytes from
the returned nodename field into name.
と書かれており、uname(2)で得られたnodenameをコピーしている。これはuname(1)で
$ uname -n
として得られるものと等しい。
まとめ
Linux (Debian/Ubuntu)環境では以下は等しい
- bashのHOSTNAME変数の値
- hostnameの出力
- uname -nの出力
Discussion