MacOSにおけるPATH変数生成は2つの問題がある。（path_helper問題１）

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

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

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

## 歴史的経緯

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

Mac版「/usr/libexec/path_helper」と.zshenv固有の問題が存在する。
2024年現在では解消されているかもしれない。
Linuxではこの問題は起きない。

2016-01-18 
[.zshenv で PATH を管理したら罠にハマった - 大学生からの Web 開発](https://karur4n.hatenablog.com/entry/2016/01/18/100000)

2016-02-14
[Mac の zsh で PATH を zshenv に設定するとハマる - 理系学生日記](https://kiririmode.hatenablog.jp/entry/20160214/1455375600)

2016-11-06
[zshでPATHがおかしくなる問題の解決編 - 理系学生日記](https://kiririmode.hatenablog.jp/entry/20161106/1478394313)

＞3.1.6 あたりから no_global_rcs というオプションが追加されていて、これを設定すると /etc/z* のファイルが読み込まれなくなることになる。

＞.zshenv あたりに
＞setopt no_global_rcs
＞とかを書いてもらえれば良い
上の記述設定は古いかもしれない。

投稿日 2017年07月20日
[zshのパス設定の順序の問題 #MacOSX - Qiita](https://qiita.com/GeneralD/items/a87d5d145149a9d214c6)

最終更新日 2017年09月
osx zsh+crontab+rbenvでの/usr/libexec/path_helperパス変更問題 #MacOSX - Qiita
https://qiita.com/github0013@github/items/c910ebb47d9be0a45282

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

2020-01-22
[zsh: /usr/libexec/path_helperから逃れる方法 2020年版 - Sexually Knowing](https://this.aereal.org/entry/zsh-path-helper)

＞Homebrewでzshを入れる際、過去には --disable-etcdir というオプションをconfigure時に渡すオプションとかがあったけどなくなっており、仕方なくforkして--disable-etcdirを付けたり、といろいろあった

:::note info
＞/etc/zprofileを読まないよう設定することもできて、これがおそらく最もポータブルな対処法でありそう。

.zshenvにunsetopt GLOBAL_RCSするだけ。
:::

投稿日 2021年02月06日
[MacでzshにおけるPATHの設定を正しく理解する #Zsh（rbenvでRubyのバージョンが切り替わらない） - Qiita](https://qiita.com/shikazuki/items/211b79fd2d7604483f05)

＞.zshrcに設定すると、rbenvで正しくrubyのバージョンが切り替えられるようになりました。実際、rbenvのgithubには$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrcのように設定するコマンドが記載されています。

投稿日 2021年11月10日
[【WIP】brew+zsh+tmux のPATH順序がおかしかったのでなんとかする #Mac - Qiita](https://qiita.com/hiradimir/items/6e7102046db4a022a03e)

＞unsetopt GLOBAL_RCS
＞なんか思った挙動にはならない。効かない？

2022.09.21
[macOS path_helperと格闘する｜ grasys blog](https://blog.grasys.io/post/yusukeh/problem-macos-path-helper/)

上記リンクにbashなら解決策が記載されている。
筆者は動作未確認だ。

2022-06-01
[$PATHが勝手に書き変わる!? - enchanのメモ書き](https://enchan1207.hatenablog.com/entry/2022/06/01/105911)

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

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

## ここまでの結論

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

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

参考
[Linux の /etc/profile /etc/bash.bashrc /etc/zsh/zshenv #Bash - Qiita](https://qiita.com/shiro_usagi/items/edfcb22e162e0e590024)

## 結論

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