Mac版 path_helper 問題を解決するシェルスクリプト(path_helper問題2)


仕様

前記事の問題(2)のみを解決する。
「問題(2) path_helper が生成するpathの優先順位の問題」
MacOS 10.6 〜10.9で動作すると思われる。
筆者が確認したのは10.6 と 10.9。
(2020-09-11、10.11でも動作を確認した。)

path_helperはPATHのみを出力(export)する。この前提が崩れては困る。

paths.dに何時の時点でファイルがインストールされるかユーザーには不明だ。
make install ログには出てくるかもしれないが出ても見落とす人が殆どだろう。
また「make install ログを毎回チェックしてpaths.d以下のファイルを気にする」そんな時間の余裕のあるエンジニアは一人もいないのでは?

この為、paths.d以下のファイルを読み込むことは今日の時点では必須であると筆者は推測する。
今後、Appleがpaths.d以下を使用禁止すれば話は別だが、この点は後日論じる用意がある。

以下はpaths.dにインストールされるファイルの仕様を筆者が推測した。
1.テキストファイルである。実行権限はインストーラーが決めるので読めないファイルは無視。
2.おそらく一行だけ
3.パスの前後に「:」は付かない
4.paths.dに複数のファイルが置かれる
5.おそらくzsh bash両方で使えるはず。

MANPATHは無視した。
/etcに記述するのと高速動作の為、中間ファイルには書き込みたくない。これ大事。

/etc/zshenv にコード(A)を記述した。

# (c) shiro_yone 2020
# Mac用 /etc/prpfile 。
# path.d からPATHを取得し先頭側に文字列連結する。
# 動作保証はしない。筆者はいっさい責任を取らない。
# 上記の条件で非商用であれば自由に使って下さい。

export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

export PATHS_D=/etc/paths.d
unset FIlES
unset line1

for FIlES in `find "$PATHS_D" -maxdepth 1 -type f `;
  do
  #echo $FIlES  # Debug
  while read line1
    do
    export PATH="$line1:$PATH"
    #echo $PATH # Debug
    #echo ""    # Debug
    done < $FIlES
  done
#echo $PATH
export PATH

結果

期待したPATH変数の結果となった。過去記事参照すること。

/etc $ pwd
/etc
/etc $ echo $PATH    
/usr/X11/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
/etc $ zsh --version 
zsh 4.3.9 (i386-apple-darwin10.0)

path_helperとシェルスクリプト(A)のメリット、デメリット

path_helperは高速動作だが、とんでもないバグがある。

(A)はシェルスクリプトである為 path_helper より実行速度が遅いかもしれない。
プロセス置換(置換でいいのか?プロセス通信?)を行うのでコード追加が難しい。
OSをアップデートや再インストールしたら(A)は消えるはず。

(b)path_helperをそのままにして見えないシステムバグや不安を多数抱える。
path_helperをそのままに継続するならば、/etc/profile、zshenvを利用するUNIX、Linuxのコマンドやライブラリーのソース全ての洗い出しが必須である。洗い出しだけでも一年以上かかるのではないか?動作検証は更に1,2年かかるだろう。
(c)シェルスクリプト(A)を記述してPATH変数だけでも解決することが出来る。結果、ユーザーから見えないか不明な動作を0に近づける。別の課題や問題が明らかになるはずである。

(b)と(c)どちらが良いか?

課題

MANPATHを諦めれば、コード(A)に課題は無いと筆者は考える。
Appleによるpath_helper修正か又はオープンソースかつC言語で新規実装が必須である。linuxと同等にすることが早急に必要だ。

10.11以降はどうすべきか?

Appleからmacbook Air 11インチ 2015年、8Gbyte、SSD512Gを私にプレゼントして欲しい思う。(笑)

過去記事

2020年08月18日に投稿
[Q&A] apple純正のsh,zsh,bash用のダメダメなパスはどのファイルに記載ありますか? - Qiita
https://qiita.com/shiro_yone/questions/3e4fcb26e18e44762446

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

mac用
zsh /etc/zshenv 用シェルスクリプト。テスト版 - Qiita
https://qiita.com/shiro_yone/items/095e2871a5fe86e27a71

MacOSにおけるPATH変数生成は2つの問題がある。(path_helper問題1) - Qiita
https://qiita.com/shiro_yone/items/8b220ca2323ea02cd804


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

参考までにLinuxの場合。
Linux の /etc/profile /etc/bash.bashrc /etc/zsh/zshenv - Qiita
https://qiita.com/shiro_yone/items/edfcb22e162e0e590024
debian-linuxではPath問題は起きない - Qiita
https://qiita.com/shiro_yone/items/22306d8dc212cc5fbf05