
新机器上我执行过：

```bash
sudo hostname m5
```

但终端里过一段时间又显示成了 `Mac`，再看系统里的 hostname：

```bash
hostname
```

输出是：

```text
Mac.lan
```

一开始以为是 shell prompt 缓存，后来发现不是。macOS 里有几套名字，`hostname` 只改了当前运行时状态，没有把系统里持久化的名字都补齐。

<!--more-->

## 先把几个名字都看一遍

```bash
hostname
scutil --get HostName
scutil --get LocalHostName
scutil --get ComputerName
```

当时我的结果大概是：

```text
hostname: Mac.lan
HostName:
LocalHostName: m5
ComputerName: m5
```

关键点是 `HostName` 是空的。`ComputerName` 和 `LocalHostName` 已经是 `m5`，但运行时 hostname 还是被系统或网络环境带成了 `Mac.lan`。

这几个名字的用途不完全一样：

| 名称 | 用途 |
| --- | --- |
| `HostName` | 系统主机名，和 `hostname` 最相关 |
| `LocalHostName` | Bonjour / `.local` 发现用的名字 |
| `ComputerName` | 系统设置、Finder、共享里显示的名字 |

所以只执行 `sudo hostname m5` 不够。它能马上改当前会话里的 hostname，但重启、切网络、DHCP 更新后，还是可能被改回去。

## 我现在会这样设置

```bash
sudo scutil --set HostName m5
sudo scutil --set LocalHostName m5
sudo scutil --set ComputerName m5
sudo hostname m5
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
```

前三条是持久化配置；`sudo hostname m5` 是让当前运行时立即生效。后面两条刷新本机缓存和 mDNS。

设置完再确认：

```bash
hostname
scutil --get HostName
scutil --get LocalHostName
scutil --get ComputerName
```

如果 `hostname` 显示 `m5.lan`，一般也可以接受，说明局域网给它补了搜索域。真正要看的是 `scutil --get HostName` 是否已经是 `m5`。

## 还会变回去时查什么

如果三项 `scutil` 都是 `m5`，但后面又变成 `Mac.lan`，我会继续查这几处：

1. 路由器或 DHCP 服务里是不是还记着旧名字。
2. DNS 反查是不是把当前 IP 指回 `Mac.lan`。
3. 登录脚本、MDM、dotfiles 里有没有重新设置 hostname。
4. prompt 是不是没有读 `hostname`，而是读了别的缓存或变量。

这次的直接原因就是 `HostName` 没有设置。以后换机器时，与其只跑 `sudo hostname`，不如把三项 `scutil` 一起设掉。

