0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2020-09-04

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?