Bash on Windows のショートカット実行で .bash_profile を読み込ませたい

ショートカットはこれ。 自分の場合 C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Bash on Ubuntu on Windows.lnk にインストールされてた。

f:id:tyru:20170723013827p:plain

結論としては ~/.profile-f ~/.bashrc && . ~/.bashrc を書いて BoW のショートカットのパスは C:\Windows\System32\bash.exe ~ --login--login を追加)にすれば無事 ~/.profile が読み込まれる。

--login を指定しただけだとコンソールで色が付かなくなるが、なぜかというと

  • ~/.bashrc環境変数 PS1 を設定してプロンプトに色を付けている
  • ~/.bashrc が読み込まれるのは「対話シェル(-i)」かつ「ログインシェル(–login)で起動されなかった」時のみ *1
    • BoW をショートカットから起動した時はデフォルトで対話的 *2
    • 最初に何もしなくても色が付いていたのはこのため
  • --login を指定するとログインシェルになるため自動的には読み込まれない
  • よって ~/.profile~/.bashrc を読み込んでやる必要がある

ちなみに .bash_profile じゃなく .profile と言ってるのは Ubuntu だとそっち使うらしい。 Ubuntu 関係なく /etc/profile が読み込まれ、その後に ~/.bash_profile, ~/.bash_login, ~/.profile の順に探索され最初に見つかったファイルが読み込まれます(@kariya_mitsuru ++)。*3

*1:“When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the –norc option. The –rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.” / man 1 bash の INVOCATION より

*2:“An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3) ), or one started with the -i option.” / man 1 bash の INVOCATION より

*3:“When bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.” / man 1 bash の INVOCATION より