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
Mac版「/usr/libexec/path_helper」と.zshenv固有の問題が存在する。
2024年現在では解消されているかもしれない。
Linuxではこの問題は起きない。
2016-01-18
.zshenv で PATH を管理したら罠にハマった - 大学生からの Web 開発
2016-02-14
Mac の zsh で PATH を zshenv に設定するとハマる - 理系学生日記
2016-11-06
zshでPATHがおかしくなる問題の解決編 - 理系学生日記
>3.1.6 あたりから no_global_rcs というオプションが追加されていて、これを設定すると /etc/z* のファイルが読み込まれなくなることになる。
>.zshenv あたりに
>setopt no_global_rcs
>とかを書いてもらえれば良い
上の記述設定は古いかもしれない。
投稿日 2017年07月20日
zshのパス設定の順序の問題 #MacOSX - Qiita
最終更新日 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
>Homebrewでzshを入れる際、過去には --disable-etcdir というオプションをconfigure時に渡すオプションとかがあったけどなくなっており、仕方なくforkして--disable-etcdirを付けたり、といろいろあった
>/etc/zprofileを読まないよう設定することもできて、これがおそらく最もポータブルな対処法でありそう。
.zshenvにunsetopt GLOBAL_RCSするだけ。
投稿日 2021年02月06日
MacでzshにおけるPATHの設定を正しく理解する #Zsh(rbenvでRubyのバージョンが切り替わらない) - Qiita
>.zshrcに設定すると、rbenvで正しくrubyのバージョンが切り替えられるようになりました。実際、rbenvのgithubには$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrcのように設定するコマンドが記載されています。
投稿日 2021年11月10日
【WIP】brew+zsh+tmux のPATH順序がおかしかったのでなんとかする #Mac - Qiita
>unsetopt GLOBAL_RCS
>なんか思った挙動にはならない。効かない?
2022.09.21
macOS path_helperと格闘する| grasys blog
上記リンクにbashなら解決策が記載されている。
筆者は動作未確認だ。
2022-06-01
$PATHが勝手に書き変わる!? - enchanのメモ書き
macOS High Sierra (v10.13)
macOS Mojave (v10.14.1)
10.12以降は筆者は未確認。
appleは問題を受け入れたのか不明。
appleはテストをしておらず、zsh標準化時にもテストと修正を怠った。
ここまでの結論
ここまでの結論。問題は昔から存在し、この数年だけでもappleにバグ報告の指摘がされていると想像される。
2020年 筆者の記事
mac版/usr/libexec/path_helperがシステムを異常動作に導く #Mac - Qiita
参考
Linux の /etc/profile /etc/bash.bashrc /etc/zsh/zshenv #Bash - Qiita
結論
結論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