是什么导致 MacOS Sierra 上 /etc/resolver/ 中的更改引起注意

Dus*_*jic 10 osx dns resolv.conf

我想为一个特定域使用非默认 DNS 解析器,第一个想法是简单地使用本地 dnsmasq。在寻找 MacOS 版本时,我发现我可以通过创建一个域名为 in 的文件来实现相同的效果,只需/etc/resolver/example.com简单的一行:

nameserver 8.8.8.8

一切都很好,按预期工作,解决方案有效,并scutil --dns确认:

resolver #8
  domain   : example.com
  nameserver[0] : 8.8.8.8
  flags    : Request A records
  reach    : Reachable
Run Code Online (Sandbox Code Playgroud)

接下来,我想通过创建一个可以在他的终端中运行的简单的 liner 来与朋友分享这一点:

sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.9" | sudo tee /etc/resolver/example.net
Run Code Online (Sandbox Code Playgroud)

再次scutil --dns确认:

resolver #10
  domain   : example.net
  nameserver[0] : 8.8.8.9
  flags    : Request A records
  reach    : Reachable
Run Code Online (Sandbox Code Playgroud)

然后我注意到一个错字,所以我将地址更正为 8.8.8.8 并再次运行该行:

sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.8" | sudo tee /etc/resolver/example.net
Run Code Online (Sandbox Code Playgroud)

但这似乎没有任何效果:

resolver #10
  domain   : example.net
  nameserver[0] : 8.8.8.9
  flags    : Request A records
  reach    : Reachable
Run Code Online (Sandbox Code Playgroud)

我检查了文件内容,一切似乎都很好:

$ cat /etc/resolver/example.net 
nameserver 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

然后我在 中打开文件vim,更改为8.8.4.4和:

resolver #10
  domain   : example.net
  nameserver[0] : 8.8.4.4
  flags    : Request A records
  reach    : Reachable
Run Code Online (Sandbox Code Playgroud)

我已经来回检查了几次,当我将地址回显到文件时,更改没有任何影响,但是只打开它vim甚至不更改任何内容(只需退出)就足够了,之前回显的更改将被应用。这背后的机制是什么?

mur*_*uru 5

[它] 只打开它vim甚至不更改任何内容(退出)就足够了,将应用先前响应的更改。

我必须使用sudo vim它才能工作。与我的普通用户一起运行它没有任何效果。我的理论是,任何正在监视的内容都会监视/etc/resolver目录的更改,而不是监视目录中的文件的更改,并且当它看到目录发生更改时会重新加载其中的所有内容。Vim 创建一个交换文件,默认在与正在编辑的文件相同的目录中。这是对目录的更改,并由观察者拾取。所以,当我这样做时:

sudo vim -n /etc/resolver/example.net
Run Code Online (Sandbox Code Playgroud)

-n禁用交换文件创建的情况下,不再获取对文件的更改。