ATOM用ターミナルプラグイン PlatformIO IDE Terminal でPATHに困った話

~/.bash_profile~/.bashrcにPATHの追加設定を書いて、bashの起動時にPATHを自動設定するということを良くやりますが、ATOMのターミナルプラグインであるPlatformIO IDE Terminalを使ってATOM内に起動したシェルのPATHが、iTERM2上のシェルでのPATHと異なってしまい、しばらく苦労してました。

困っていたこと

私は普段~/.bash_profileで、追加したいパスがPATHになかった場合のみ追加するという処理を書いています。

.bash_profile
gnubin_path=/usr/local/opt/coreutils/libexec/gnubin

echo $PATH | grep -q $gnubin_path > /dev/null 2>&1

if [ $? -ne 0 ]; then
  export PATH=$gnubin_path:$PATH
fi

iTERM2でシェルを起動したとき、PATHは以下のようになっていました。

$ echo $PATH
/usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

この状態だと、例えばlsコマンドは/usr/local/opt/coreutils/libexec/gnubin/lsのバイナリを使用します。

$ which ls
/usr/local/opt/coreutils/libexec/gnubin/ls

しかし、ATOM内のシェルでは以下のように/usr/local/opt/coreutils/libexec/gnubinが後ろに来てしまっています。

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/opt/coreutils/libexec/gnubin

この状態だと、lsコマンドは/bin/lsのバイナリを使用してしまいます。

$ which ls
/bin/ls

原因

bashは親プロセスの環境変数を子プロセスに引き継ぎます。
ATOMプロセスのPATHが/usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinになっていると、その子プロセスとなるATOM内シェルのPATHには/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/opt/coreutils/libexec/gnubinが引き継がれます。
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinはbashの終了時にPATHから削除され、bashの起動時に自動的にPATHの先頭に追加されるようです。

この状態で.bash_profileが実行されるので、すでに該当のパスが存在していると判断されて、export PATH=$gnubin_path:$PATHが実行されません。

解決方法

ATOM内シェルの時のみ、PATHを初期化するという処理を.bash_profileに加えてあげれば良いです。
現在のシェルがATOM内シェルかどうかは、親プロセスのコマンドにplatformio-ide-terminal/lib/process.coffeeが含まれているかどうかで判断しています。

.bash_profile
ps u -p $PPID | grep 'platformio-ide-terminal/lib/process.coffee' > /dev/null 2>&1
if [ $? -eq 0 ]; then
  export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
fi

gnubin_path=/usr/local/opt/coreutils/libexec/gnubin

echo $PATH | grep -q $gnubin_path > /dev/null 2>&1

if [ $? -ne 0 ]; then
  export PATH=$gnubin_path:$PATH
fi

これでATOM内シェルでも以下のPATHが設定されます。

/usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.