MacOSにおけるPATH変数生成は2つの問題がある。(path_helper問題1)


Mac版 path_helper 問題の歴史と経緯。

MacOSにおけるPATH変数生成は2つの問題がある。
問題(1) pathsファイルにかかれたパスの優先順位の問題。
問題(2) path_helper が生成する各pathの優先順位の問題。

(1) は /usr/local/bin を一番上の行に書くことで解決出来る。
(2) は 複雑でbashとzshで挙動が3つ以上の異なるケースがありえる。

歴史的経緯

2009年以前
path_helper が作成された時期と作者(Apple又はBSD系ディストリ?)は現時点では不明。

2009年〜2010年
今回調べたら10.6.8なMacでも問題(1)(2)は存在していた。

paths.d $ pwd
/etc/paths.d
paths.d $ ls
X11
paths.d $ more X11 
/usr/X11/bin
paths.d $ /usr/libexec/path_helper 
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"; export PATH;
paths.d $ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.
paths.d $ zsh --version
zsh 4.3.9 (i386-apple-darwin10.0)
paths.d $ 

2012年10月
【Mac】zshをサブシェルで起動するとPATHがおかしくなる - よんちゅBlog
http://yonchu.hatenablog.com/entry/2012/10/19/010307

==> Caveats
To use this build of Zsh as your login shell, add it to /etc/shells.

If you have administrator privileges, you must fix an Apple miss
configuration in Mac OS X 10.7 Lion by renaming /etc/zshenv to
/etc/zprofile, or Zsh will have the wrong PATH when executed
non-interactively by scripts.

Alternatively, install Zsh with /etc disabled:

  brew install --disable-etcdir zsh

homebrew作者は2012年10月以前に本件の問題に気がついている。
現在も、上記の方法が(推奨ではなく)仕方なく提示されているかもしれない。
筆者はhomebrewのzshインストール現状を知らないが、/etcをユーザーが修正する方針だ。
(renaming /etc/zshenv to /etc/zprofile)

筆者は今回の件で問題(2) を初めて知った。(1)は昔から知っていたが
bash_profileやzshenv で
expoert PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin (3)
と/etcにある問題(1)を嫌って初期化していた為、問題(2)に気がつくのが遅れた。

2013-06-20
OSX + screen + rbenv でハマった話 - kurainの壺
https://r-kurain.hatenablog.com/entry/20130620/1371734555

2017年12月
path_helper ($PATHを設定するコマンド) (macOS, /etc/paths.d, /etc/paths, shell間をまたいだパス設定) - いろいろ備忘録日記
https://devlights.hatenablog.com/entry/2017/12/12/160216

2019年11月
Macの$PATHの設定箇所は「/etc/paths」にある - Qiita
https://qiita.com/pure-one/items/7ec745056ddc65d7ef50

macOS High Sierra (v10.13)
macOS Mojave (v10.14.1)

10.12以降は筆者は未確認。
appleは問題を受け入れたのか不明。
appleはテストをしておらず、zsh標準化時にもテストと修正を怠った。

ここまでの結論

ここまでの結論。問題は昔から存在し、この数年だけでもappleに指摘されていると想像される。

2020年 筆者の記事
mac版/usr/libexec/path_helperがシステムを異常動作に導く - Qiita
https://qiita.com/shiro_yone/items/a35f445e1c8d2293d123

参考
Linux の /etc/profile /etc/bash.bashrc /etc/zsh/zshenv - Qiita
https://qiita.com/shiro_yone/items/edfcb22e162e0e590024

結論

結論1
bashやzsh、vim、screen等の/etcを使用するソフトウェア(以下/etc使用ソフト)からOSを見ると、/etcは(エンドユーザーではないが)OSプロバイダー(日本語で提供者、提供会社。)である人間が設定すべき。
結論2
/etc使用ソフトからOSを見ると、/etcから出力されるPATHはMacであれば
/usr/local/binが前に来て優先される(3)が望ましい。
結論3
「System Integrity Protection(SIP)」の仕様の為、10.11以降
「/usr/local/bin 」はPATH変数で「/usr/bin:/bin:/usr/sbin:/sbin」より前の記載が必須。
10.9以前のOSよりも強制されるべき。
結論4
/etc/paths.dのPATH変数も「/usr/bin:/bin:/usr/sbin:/sbin」より前の記載が必須。
結論5
結論2,3,4において、PATH優先順位の考え方はlinuxと同じ優先順位となる結果が得られることが望ましい。
/etc使用ソフトからみて、PATHがらみのコードは一つで済む。
結論6
path_helper には明らかなバグがある。

この問題だけでもサーバーやインフラ、ネットワーク構築者はMacを嫌って当然。エンジニアの上司だって部下にlinuxにしとけ、と言うに決まってる。めんどくさい。

homebrew作者一人が問題(1)(2)に気がついていても、利用している実行バイナリーやライブラリーは無数の人手から成り立っている。検証と断言は出来ないが各バイナリーやライブラリー作者がMac特有のPATH問題に気がついてなくても当然だと思った。
どんな不具合が起きてもおかしくはない。


djeeno.log: Mac で sh/bash/zsh などシェルログイン時に Wireshark: Permission denied と出力される
https://djeeeno.blogspot.com/2019/12/20191227-01-wireshark-permission-denied.html