macのコマンド実行がやたらと遅いので調査したら意味のないexportがあった

プライベートで使っているMacBookAirの挙動がおかしくなったので調査して対応したときのメモを残す。

どういうことが起きていたかというとlsコマンドなど、LinuxやMacなどで開発していると絶対に使うコマンド群達の実行結果がやたらと遅かった。

ls

と入力してから1秒くらいしてlsコマンドの結果(カレントディレクトリに何があるか表示)が返ってくる、かなりストレスフルな現象だった。


症状:source ~/.bashrc すると環境変数がおかしくなっていく

ここでは「lsコマンドがどうして遅くなったのか」、を説明するにあたってUnix系OSの環境変数の知識が必要となる。

$ source ~/.bashrc

は筆者がbashしか知らない && lsコマンドが遅くなった原因だったので表題とした。
「source ~/.bashrc」や「source ~/.bash_profile」が何を行っているか気にしないでコピペしてきた罰が降ったとでも思ってください。

初期状態

$ env | grep PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/user/Library/Android/sdk/platform-tools:/Users/user/.nodebrew/current/bin:/usr/bin/

envコマンドはシステムの環境変数を表示するコマンドである。

source ~/.bash_profile した後、envの結果が変わる

$ source ~/.bash_profile
$ env | grep PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/user/Library/Android/sdk/platform-tools:/Users/user/.nodebrew/current/bin:/usr/bin/:/Users/user/Library/Android/sdk/platform-tools:/Users/user/.nodebrew/current/bin:/usr/bin/

?!

明らかに初期状態とPATHが変わっていることに気づくだろう。

なんだこれ?と思いながら何気なくbashの設定を見ると怖いことが起きていた。

コマンド実行が遅くなっていた原因は意味のないexportだった

私のbash_profileには恐ろしいことが書かれていた。。。

# for android
export ANDROID_SDK=/Users/user/Library/Android/sdk/platform-tools
# for node.js
export NODE=$HOME/.nodebrew/current/bin
# ...
# 他にもたくさん・・・省略
# ...
# user settings
export PATH=$PATH:$ANDROID_SDK:...(省略)...:$NODE:/usr/bin/

うむ、今見ても超恥ずかしい。。。export NODEなどとカッコつけようとした後にとても意味のない、危ないことをしている。
意味も理解せずにカッコつけた天罰が下る良い例である。

export HOGE=hogehoge

と書くとHOGEという環境変数にhogehogeという値が設定されるわけなのだが、私はそれを更に

export PATH=$PATH:$HOGE:/usr/bin

と書いていた。つまりsource ~/.bash_profileをした分だけlsコマンドが入っている/usr/binディレクトリまでの検索が遅くなるわけである。

おかしいなー、おかしいーなーと思いながら.bashrcファイルや.bash_profileを見直しては修正し、source ~/.bash_profileをするとどんどんlsコマンドが遅くなるのである。下手すると何もできなくなる可能性すらあった。

正しい.bash_profileの書き方は以下の通り

# for android
ANDROID_SDK=/Users/user/Library/Android/sdk/platform-tools
# for node.js
NODE=$HOME/.nodebrew/current/bin
# ...
# 他にもたくさん・・・省略
# ...
# user settings
export PATH=$PATH:$ANDROID_SDK:...(省略)...:$NODE:/usr/bin/

↑のように最後に一度だけexport PATH=$PATH:$HOGE:/usr/binとしてやってコマンドのパスを通し、source ~/.bashrcないし、source ~/.bashrc_profileをしてやれば良い。(これも何が起きるか考えてからやったほうがいい)
とすれば良い。

他のリファレンスサイトでexportを例に使った環境変数の設定があるが、exportした時点で環境変数には設定されているので、PATHの設定にexportした環境変数を入れるとどんどんすごいことになる。

結果的に基本コマンドであるlsの入った/usr/binディレクトリへの検索が遅くなってmacが重くなったように感じるのである。

まとめると

中途半端にコピペを信じてはいけない。

だいたいの環境変数を設定するリファレンス本当に何もやったことがない人がコピーすると良いが、中途半端な知識でコピペをするとOSの動作に影響が出て、最悪無限ループが発生してOSがぶっ壊れるので、ちゃんとexportしましょうね!という話でした。

macとかでターミナルを開いてドヤ顔をする前にUnixを理解しろ、という超恥ずかしいミスです。

結局本当にこのexportが原因でlsやpwdが遅くなっていました。

他のexport文を修正して再起動したら元のスピードに戻りました。

それにしても、今回の謎export文達は一体どういう気持ちで書いていたのだろうか・・・


コメントを残す

This site uses Akismet to reduce spam. Learn how your comment data is processed.