/etc/profile でのPATH設定が原因で違う。
# System-wide .profile for sh(1) if [ -x /usr/libexec/path_helper ]; then eval `/usr/libexec/path_helper -s` fi if [ "${BASH-no}" != "no" ]; then [ -r /etc/bashrc ] && . /etc/bashrc fi
path_helper のコマンドでPATHが作られている。
どうやら、path_helper コマンドがPATHを生み出しているようだ。
試しに実行してみた。
takuya@air:~$ /usr/libexec/path_helper PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/share/npm/bin:/Users/takuya/.rbenv/shims:/Users/takuya/bin:/usr/local/sbin"; export PATH;
なるほど、PATHを出力してExportするコマンドまで書いてくれるのか。便利だ。
man を探す
/etc/profile では 「-s」オプションを付けて実行されているが、有無を変えてみても結果は変わらず。-h/--help も受け付けない。
man を探してみた
takuya@air:~$ man -k path_helper path_helper(8) - helper for constructing PATH environment variable
man記述+和訳
path_helper(8) BSD System Manager's Manual path_helper(8) NAME path_helper -- helper for constructing PATH environment variable SYNOPSIS path_helper [-c | -s] DESCRIPTION The path_helper utility reads the contents of the files in the directories /etc/paths.d and /etc/manpaths.d and appends their contents to the PATH and MANPATH environment variables respectively. (The MANPATH environment variable will not be modified unless it is already set in the environment.) Files in these directories should contain one path element per line. Prior to reading these directories, default PATH and MANPATH values are obtained from the files /etc/paths and /etc/manpaths respectively. 説明 path_helper ユーティリティは、/etc/paths.d と /etc/manpaths.d ディレクトリ中のファイルを読み取って、それぞれをPATHとMANPATHに追加して、それぞれ環境変数を作ります。(MANPATH は既に環境変数に設定されている時のみ編集されています) 訳註:/etc/xxx.dというディレクトリを見るなら、暗黙の了解で/etc/xxxというファイル見た方がいい。 Options: -c Generate C-shell commands on stdout. This is the default if SHELL ends with "csh". -s Generate Bourne shell commands on stdout. This is the default if SHELL does not end with "csh". NOTE The path_helper utility should not be invoked directly. It is intended only for use by the shell profile. Mac OS X March 15, 2007 Mac OS X
/etc/paths.d に書いてある。
/etc/paths.dのファイルにどのようなPATH環境変数を作り出したいか記述すれば、path_helper の動作を制御できるのです。
さっそく、既に設定されたものを見てみましょう。
takuya@air:~/Desktop$ find /etc/path* /etc/paths /etc/paths.d /etc/paths.d/40-XQuartz
合計3ファイルあることが分かる。
takuya@air:~/Desktop$ find /etc/path* -type f -exec cat {} \; /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/X11/bin
ふむ。。。つまりこういうことか
つまり、 /etc/path* をマージして、 改行を 区切り「:」に置換すれば同じ結果に。。。
takuya@air:~/Desktop$ find /etc/path* -type f -exec cat {} \; | tr '\012' ':' /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
同じ結果にならない
なんと、man にある/etc/path*と同じ結果にならないのでした。
takuya@air:~/Desktop$ /usr/libexec/path_helper PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/share/npm/bin:/Users/takuya/.rbenv/shims:/Users/takuya/bin:/usr/local/sbin"; export PATH;
これはなにかというと、path_helper 実行時に、すでにPATHがあれば、path_helper は既存PATHを考慮したPATHを出力してくれる。
PATHを空にするとよく分かる。
takuya@air:~$ export PATH= takuya@air:~$ /usr/libexec/path_helper PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin"; export PATH;
PATHを空にする前と、空っぽにした後で、値が違うのです。つまり、path_helper は既に設定されていたら、その値を尊重して、/etc/pathの中身を追記してくれると仕様です。嬉しいですね。