cygwin/bash の設定
関連リンク
bash のリソースファイルの読み込みの仕組み
ログインシェルとして起動した場合の動作
bash が対話的なログインシェルとして起動されるか、
--login オプション付きの非対話的シェルとして起動されると、
/etc/profile ファイルが存在すれば、
bash はまずここからコマンドを読み込んで実行します。
このファイルを読んだ後、
bash は ~/.bash_profile, ~/.bash_login, ~/.profile をこの順番で探します。
bash は、
この中で最初に見つかり、
かつ読み込みが可能であるファイルからコマンドを読み込んで実行します。
--noprofile オプションを使ってシェルを起動すれば、
この動作を行わないようにできます。
ログインシェルが終了するときには、 ~/.bash_logout ファイルがあれば、 bash はこれを読み込んで実行します。
まとめると、
bash は起動時に以下の順でファイルを読み込む
bash は起動時に以下の順でファイルを読み込む
- /etc/profile
- ( ~/.bash_profile | ~/.bash_login | ~/.profile ) // 左から最初に見つかったヤツだけを読み込む。
終了時には以下のファイルを読み込む
- ~/.bash_logout
対話的シェルとして起動したときの動作
ログインシェルでない対話的シェルとして起動されると、
~/.bashrc ファイルがあれば、
bash はここからコマンドを読み込み、
実行します。
この動作は --norc オプションで行わないようにできます。
--rcfile file オプションを使うと、
コマンドの読み込みと実行を ~/.bashrc からでなく file から行わせることができます。
平たく言えば、
~/.bashrc の読み込むってこったな。
~/.bashrc の読み込むってこったな。
シェルスクリプト実行で起動したときの動作
(例えばシェルスクリプトを実行するために) 非対話的に起動されると、
bash は環境変数 BASH_ENV を調べ、
この変数が定義されていればその値を展開し、
得られた値をファイル名とみなして、
そこからコマンドの読み込みと実行を行います。
つまり bash は以下のコマンドが実行されたのと同じように動作します:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
ただし、
ファイル名を探すために PATH 環境変数の値が使われることはありません。
BASH_ENV に設定したファイルを読み込むってこったな。
リソースファイルの設定
早速設定しようかと思ったのだが、PATHの設定でちょっと悩んだ。
WindowsのパスだとC:\~~って形式だけど、
Cygwinだと/cygdrive/d/~って形式になる。
その辺はどうなってんのよ?と。
WindowsのパスだとC:\~~って形式だけど、
Cygwinだと/cygdrive/d/~って形式になる。
その辺はどうなってんのよ?と。
んで、実験した。
実験
まずは環境変数を取得するプログラムを書いてみる
getenv.c
#include <stdio.h> // printf #include <stdlib.h> // getenv EXIT_SUCCESS void usage(const char* appname) { printf( "usage:\n" "%s ENVNAME\n" "\tENVNAME\t:環境変数の名前を入れてくだしあ\n", appname); } int main(int argc, char* argv[]) { char* env_value; if (argc != 2) { usage(argv[0]); } else { env_value = getenv(argv[1]); if (env_value == NULL) env_value = "not defined"; printf("%s:\n\t%s\n", argv[1], env_value); } return EXIT_SUCCESS; }
それをコンパールする。
$ cl.exe getenv.c
んで、Cygwin/bash を起動。
getenv.exe のあるフォルダに移動して、
getenv.exe のあるフォルダに移動して、
$ echo $PATH // パスの設定を確認 /bin:/usr/bin $ ./getenv PATH PATH: D:\usr\bin\GNU\cygwin\bin;D:\usr\bin\GNU\cygwin\bin
おお!
ちゃんと変換されてる!
ちゃんと変換されてる!
ってことは、安心して Cygwin 形式のパスで設定すればいいのか!!
$ echo $INCLUDE /home/dev/Include $ ./getenv INCLUDE INCLUDE: /home/dev/Include
ん?あれ?
変換されてないお(;^ω^)
スルーされてるお
これは困ったお。
スルーされてるお
これは困ったお。
…ま、いっか。
MinGW開発とかやる予定ないし、GCC使わないし、つか使い方よくわからんし、
欲しいのは開発がらみのサブツールと便利なシェルだし。
MinGW開発とかやる予定ないし、GCC使わないし、つか使い方よくわからんし、
欲しいのは開発がらみのサブツールと便利なシェルだし。
ツー訳で、謎は全て解けた!
Cygwin 環境は $PATH は、 WIN<>Cygwin の相互変換をするけど、
それ以外は何もしない!
それ以外は何もしない!
んじゃ設定ファイルゴリゴリかくべ。
設定ファイル
$ cat .bash_profile
source ~/.bashrc
$ cat .bashrc
# 各種便利設定 HISTCONTROL=ignoreboth HISTFILESIZE=1024 PS1="\[\e]0;\w\a\]\n\[\e[32m\]chincoondo@local \[\e[33m\]\w\[\e[0m\]\n\$ " # 日本語を通すように変更 # 参考:http://uenox.ld.infoseek.co.jp/cygwin/japanese2.html export LANG=ja_JP.SJIS export TZ=JST-9 export JLESSCHARSET=japanese-sjis # エイリアス設定 export WINAPP_BASEPATH='/home/bin' alias gvim="$WINAPP_BASEPATH/vim/gvim.exe" alias ls='ls -a --show-control-chars --color -F' # 元々のパスを分離しておく # 途中で $PATH を戻したくなったときに役に立つ export DEFAULT_PATH=$PATH source ~/bashrc/vcpprc
$ cat ~/bashrc/vcpprc
# $PATH 以外でWinアプリ用のパス設定を使うヤツ用ショートカッツ export WINAPP_BASEPATH_FOR_WIN="D:\\usr\\bin" export VSINSTALLDIR="$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8" export VCINSTALLDIR="$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8\\VC" export FrameworkDir="C:\\WINDOWS\\Microsoft.NET\\Framework" export FrameworkVersion="v2.0.50727" export FrameworkSDKDir="$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8\\SDK\\v2.0" echo Setting environment for using Microsoft Visual Studio 2005 x86 tools. export DevEnvDir="$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8\\Common7\\IDE" export PATH="$WINAPP_BASEPATH/Microsoft Visual Studio 8/Common7/IDE":\ "$WINAPP_BASEPATH/Microsoft Visual Studio 8/VC/BIN":\ "$WINAPP_BASEPATH/Microsoft Visual Studio 8/Common7/Tools":\ "$WINAPP_BASEPATH/Microsoft Visual Studio 8/SDK/v2.0/bin":\ "/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727":\ "$WINAPP_BASEPATH/Microsoft Visual Studio 8/VC/VCPackages":\ $PATH # 区切り文字 : だとWinアプリが理解しないので ; で区切る export INCLUDE="D:\\usr\\dev\\Include\\boost-1_33_1;"\ "D:\\usr\\dev\\Include;"\ "$INCLUDE;"\ "$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8\\VC\\INCLUDE" # 区切り文字 : だとWinアプリが理解しないので ; で区切る export LIB="D:\\usr\\dev\\Lib;"\ "%LIB%;"\ "$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8\\VC\\LIB;"\ "$WINAPP_BASEPATH_FOR_WIN\\Microsoft Visual Studio 8\\SDK\\v2.0\\lib" export LIBPATH="C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727"
$ cat ~/.inputrc
# 参考:http://uenox.ld.infoseek.co.jp/cygwin/japanese2.html set kanji-code sjis set convert-meta off set meta-flag on set output-meta on
ツー訳で、こんな感じで出来上がり。
なんかアレだね、zsh に比べると非常にシンプルな感じだ。
本当はもっとおもしろ機能とかあるのかしらねぇ。
なんかアレだね、zsh に比べると非常にシンプルな感じだ。
本当はもっとおもしろ機能とかあるのかしらねぇ。