|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|

cygwin/bash の設定

    

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


cygwin/bash の設定

関連リンク


bash のリソースファイルの読み込みの仕組み


ログインシェルとして起動した場合の動作


Linux Manpage of Bash から引用
bash が対話的なログインシェルとして起動されるか、
 --login オプション付きの非対話的シェルとして起動されると、
/etc/profile ファイルが存在すれば、
bash はまずここからコマンドを読み込んで実行します。
このファイルを読んだ後、
bash は ~/.bash_profile, ~/.bash_login, ~/.profile をこの順番で探します。
bash は、
この中で最初に見つかり、
かつ読み込みが可能であるファイルからコマンドを読み込んで実行します。
 --noprofile オプションを使ってシェルを起動すれば、
この動作を行わないようにできます。

ログインシェルが終了するときには、 ~/.bash_logout ファイルがあれば、 bash はこれを読み込んで実行します。

まとめると、
bash は起動時に以下の順でファイルを読み込む
  1. /etc/profile
  2. ( ~/.bash_profile | ~/.bash_login | ~/.profile ) // 左から最初に見つかったヤツだけを読み込む。

終了時には以下のファイルを読み込む
  1. ~/.bash_logout

対話的シェルとして起動したときの動作


Linux Manpage of Bash から引用
ログインシェルでない対話的シェルとして起動されると、
~/.bashrc ファイルがあれば、
bash はここからコマンドを読み込み、
実行します。
この動作は --norc オプションで行わないようにできます。
 --rcfile file オプションを使うと、
コマンドの読み込みと実行を ~/.bashrc からでなく file から行わせることができます。

平たく言えば、
~/.bashrc の読み込むってこったな。

シェルスクリプト実行で起動したときの動作


Linux Manpage of Bash から引用
(例えばシェルスクリプトを実行するために) 非対話的に起動されると、
bash は環境変数 BASH_ENV を調べ、
この変数が定義されていればその値を展開し、
得られた値をファイル名とみなして、
そこからコマンドの読み込みと実行を行います。
つまり bash は以下のコマンドが実行されたのと同じように動作します:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

ただし、
ファイル名を探すために PATH 環境変数の値が使われることはありません。

BASH_ENV に設定したファイルを読み込むってこったな。

リソースファイルの設定


早速設定しようかと思ったのだが、PATHの設定でちょっと悩んだ。
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 のあるフォルダに移動して、
$ 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使わないし、つか使い方よくわからんし、
欲しいのは開発がらみのサブツールと便利なシェルだし。

ツー訳で、謎は全て解けた!

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 に比べると非常にシンプルな感じだ。
本当はもっとおもしろ機能とかあるのかしらねぇ。