それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

path_helperについて。Mac OSX 版

OSX のPATHはどうも設定が変になる。

OS X のPATHの設定は、Linuxに比べて変になる。同じ~/.bashrc を使っているのにどうも違う。

/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の中身を追記してくれると仕様です。嬉しいですね。