mac版/usr/libexec/path_helperがシステムを異常動作に導く

macOSX 10.9限定

## 経緯

コメント欄の下まで熟読のこと。

リンク（A）
[Q&A] apple純正のsh,zsh,bash用のダメダメなパスはどのファイルに記載ありますか？ - Qiita
https://qiita.com/shiro_usagi/questions/3e4fcb26e18e44762446

## 問題 mac版/usr/libexec/path_helperがシステム設定を異常動作に導く

```
$ /usr/libexec/path_helper -s
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/Users/xxxxxxx/bin"; export PATH;
MANPATH="/usr/share/man:/usr/local/share/man"; export MANPATH;
~ $ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/Users/xxxxxxx/bin
~ $ vim

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/Users/xxxxxxx/bin

Press ENTER or type command to continue
~ $ zsh --version
zsh 5.8 (x86_64-apple-darwin13.4.0)
```

上記の質問で書いた、vimとzshのパスの不一致は無くなった。
path_helper周辺が怪しいのは明確になった。

筆者の勉強不足で /usr/libexec/path_helper -s の出力先ファイルが存在するか分かってない。path設定は .zshenv で

```
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin
export PATH=/usr/local/stow/gettext-021/bin:$PATH
export PATH=/usr/local/stow/ruby/bin:$PATH
```

## 暫定的解決方法

MacOSXが10.9なので/usr/libexec/path_helper chmod 644とし、実行権限を外した。
この方法は推奨されない。
以下の通り、期待する結果となった。

```
~ $ echo $PATH
/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/xxxxxxx/bin
~ $ vim

/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/xxxxxxx/bin

Press ENTER or type command to continue
```

## 推測される問題の箇所

候補１
/usr/libexec/path_helper周辺。
なお、筆者は /etc/paths のファイルを書き換えている。

```
/etc $ more paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/etc $
```

候補２
vim は /usr/libexec/path_helper （-s or -c） を実行しているだけかもしれない。
linux関係では問題が起きてないであろうから、Mac版だけで問題発生と思われる。

## 新たな問題点
Linuxでは使えるらしい unsetopt GLOBAL_RCS と /usr/libexec/path_helper を
 .zshenv で読み込んでも上記の問題が発生する。
根本的かつ、根の深い重大問題である。

```
# ignore /etc/zprofile, /etc/zshrc, /etc/zlogin, and /etc/zlogout
# ref. http://zsh.sourceforge.net/Doc/Release/Files.html
# ref. http://zsh.sourceforge.net/Doc/Release/Options.html#index-GLOBALRCS
unsetopt GLOBAL_RCS
# copied from /etc/zprofile
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi
```

```
$ cd /etc/paths.d
paths.d $ la
total 0
drwxr-xr-x    2 root  wheel    68B  8 25  2013 .
drwxr-xr-x  101 root  wheel   3.4K  8 18 09:31 ..
paths.d $
```

いじった覚えがないので怖い。


## 新たな問題点２

unsetopt GLOBAL_RCS を .zshenv の最初に行い
eval `/usr/libexec/path_helper -s`
はコメントアウトするとリンク（A）に記載したzsh (期待した正常値)とvim (期待しない異常値)でパスの不一致が再現する。

### 所感

zshは便利だがmacの場合、sshやtmux screen vim cron等々で複合した環境で耐えられなさそうだ。
こんなつまんないAppleのバグで皆、Linux環境をインストしているかもしれない。

path_helperについて。Mac OSX 版 - それマグで！
https://takuya-1st.hatenablog.jp/entry/2013/12/14/040814
ここでは path_helper は擁護されているが私は疑問に思う。

/etc/profile 又は /etc/zshenvを読んだ直後のPATH値はMacであれば
「/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin」
が望ましいと推測。

## 2020-08-29追跡調査

/etc/zshenv内部でパスをクリアしてみた。

```
/etc $ /usr/libexec/path_helper
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/Users/xxxxxxx/bin"; export PATH;
MANPATH="/usr/share/man:/usr/local/share/man"; export MANPATH;
/etc $
/etc $ cat zshenv
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
	eval `/usr/libexec/path_helper -s`
    PATH=""　（＜ーこれを追記した）
fi


~ $ echo $PATH
/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/xxxxxxxx/bin
~ $ vim



Press ENTER or type command to continue

vimからの:!echo $PATHはクリアされた。
```

vimはmac用内部コードで、zshシェルに対応する /etc/zshenv を読み込むと思われる。（調べてないけどbashは profile？） 
Mac版 path_helper が生成する問題パスが明らかになった。
よって、少なくともzsh＋vim環境では２つの対策のうちどちらかを行う必要がある。

(1) /etc/zshenv 内部を書き換える
(2)  path_helper の実行権限を外す

2020-08-29、今日の時点では(2)のほうがいいと思われる。
bash環境は path_helper が問題パスをどこで正常値にリカバリーしているのか不明。
誰か教えて下さい。


### 追記
macにおいて、sshやtmux screen vim cron等で読み込むPATHが理想と仕様がどうあるべきか？
(1)/etc側だけで用意するPATH
(2)ユーザーで用意するPATH （ユーザー追加分と /usr/local/bin ）

(A) (1)だけ
(B) (1)次に(2)。(1)を優先。
元々のAppleが用意した/usr/local/binが優先されない /etc/paths はこれ。
(C) (1)をクリアして(2)だけ。(2)を優先。
zshだけでsshやtmux screen vim cron等を使わないならこれで問題ない。
(D) (1)と(2)を読むが(2)を優先。

優先とはPATH変数の先頭側に記述する、ということ。
vimはユーザーが自由に使う為、(D) が理想と思われる。


### 参考リンク

Mac OSX El Capitan での ~/.zshenv の扱いについて - Qiita
https://qiita.com/t-takaai/items/8574ff312f2caa5177c2

zsh で path にディレクトリを追加するときは (N-/) を付けよう - Qiita
https://qiita.com/mollifier/items/42ae46ff4140251290a7

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

テキスト処理のための標準的なコマンド群の macOS への導入手順 - Qiita
https://qiita.com/eumesy/items/3bb39fc783c8d4863c5f#1-%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%BF%E6%95%B4

osx zsh+crontab+rbenvでの/usr/libexec/path_helperパス変更問題 - Qiita
https://qiita.com/github0013@github/items/c910ebb47d9be0a45282

PATH設定がどこにあるか分からないときに見るべきファイル - Qiita
https://qiita.com/gm_kou/items/24dec9f0e51b9343651b

以上