FSLはデフォルトでは、Linuxの場合は、.profile の下、macOS の場合はお使いのシェルに応じて、.bash_profile もしくは .zprofile の下に 以下のような設定が書き込まれます。(6.0.6以降の設定です)
# FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/share/fsl/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh
この内容を理解できると、ソフトの設定がわかるようになるので、1行ずつ解説してみます。
- # FSL Setup
- 日本語訳:コメント – FSLの設定をこれから書きます
- 解説
- FSLDIR=/usr/local/fsl
- 日本語訳: /usr/local/fsl を FSLDIR という変数に代入しなさい
- 解説
- PATH=${FSLDIR}/bin:${PATH}
- 日本語訳:これまでのパスの一番最初に $FSLDIR を追加しなさい。
- 解説
- export FSLDIR PATH
- 日本語訳:変数FSLDIR と 変数PATH をエクスポートしなさい
- 解説
- . ${FSLDIR}/etc/fslconf/fsl.sh
- 日本語訳:今のシェルの中で、/usr/local/fsl/etc/fslconf/fsl.sh を実行しなさい。
- 解説
# があると、それ以降はコメントとして、プログラムは読み込みません。この行は、あくまでも読み手が、「あ、ここはFSLの設定のセクションなのね」とわかるためのものです。設定を書く際は、コメントを書く習慣をつけることをおすすめします。
システムに、FSLの場所を伝える作業をします。
場所は長いので、変数に代入することが多いです。
今の場合、FSLをインストールした場所、 /usr/local/fsl を `FSLDIR` という変数に代入しています。
こうすることで、この後は $FSLDIR と使うことで、 /usr/local/fsl と書かずにすみます。
インストールしたプログラムをシステムに認識させるために必要なものが「パスへの追加」です。
パス変数、PATH は、各種のプログラムの実行ファイルがあるディレクトリを記したものになります。
よかったら、ターミナルから `echo $PATH` とタイプしてみてください。
そこで出てくる出力は、システムが認識しているプログラムへのパス一覧です。
読み解き方は、
パス1:パス2:パス3: というように、あるプログラムへのパスを コロン: でつなげていきます。
システムはユーザーがあるコマンドをタイプした時、このPATH変数を見に行って、プログラムを探しに行きます。
大事なことは、パスは順序が大事ということです。パスはとても長いので、システムは時間を節約するために、パスを最初から探しに行って、一番最初にコマンドを見つけた時点で、その後のパスを探すことをやめます。
たとえば、あるコマンド `cmd1` が、/usr/local/bin と、 /home/brain/bin の中のどちらにもあったとします。
その時、PATHが
/usr/local/bin:/home/brain/bin
という風になっていたら、システムは、/usr/local/bin をまず探して、cmd1 を発見したら、それを使います。もし、/home/brain/bin の中にある cmd1 を使いたい場合は、PATH変数を
/home/brain/bin:/usr/local/bin
と書き換える必要があります。
今の場合に戻ると、FSLDIR の場所は、PATH の前についていますね。
PATH=${FSLDIR}/share/fsl/bin:${PATH} は、これまでの変数PATHの前に、${FSLDIR}/share/fsl/bin を追加したものを、新たな PATH として設定しなさいというメッセージです。つまり、FSLは、「自分のプログラムを一番最初に探してくれ!」と主張しているわけですね。
ちなみに、$PATH と ${PATH} は同じ意味です。{ } を使うことのメリットは、文字列をつなげることができることです。
今の場合、${FSLDIR}/share/fsl/bin は /usr/local/fsl/share/fsl/bin という意味になります。
ちなみに、FSL6.0.6から、FSLの実行ファイルの場所が、${FSLDIR}/bin から ${FSLDIR}/share/fsl/bin に変更になりました。注意してください。
エクスポートというのは、あるシェルから新たなシェルを立ち上げた時に、その変数を継承することを意味します。これをしておくことで、プログラムが新たなシェルを立ち上げた際にも変数FSLDIRはそのシェルに引き継がれます。
この行のポイントは、一番最初にあるドット `.` です。実は、行頭にあるドットは、`source` というコマンドと同義です。つまり、この行は、
source ${FSLDIR}/etc/fslconf/fsl.sh
と同義ということになります。(マニアックな話をすると sh には source はないですが、それはオタクの話なので、bash や zsh ではということです)
この `source` というコマンドは、`source ファイル` とした時に、現在のシェルの中でファイルを実行します。
実際、このコマンドで読み込むファイルには、様々な変数が設定されていることが多いです。
我々がひとつひとつ設定しなくていいように、前もって設定してくれています。
実際、/usr/local/fsl/etc/fslconf/fsl.sh を見てみると、以下のような設定が書かれています。
FSLOUTPUTTYPE=NIFTI_GZ # <- FSLの出力ファイル形式は .nii.gz になる設定はここから来ています。 これはあくまでも一例です。fsl.sh によって様々な変数が設定されます。bashでは、変数は `env` コマンドで確認できますので、確認してみましょう。 grep で FSL というキーワードが入っている変数を探してみます。 env | grep FSL FSLDISPLAY=/usr/bin/display FSL_DIR=/usr/local/fsl FSLWISH=/usr/local/fsl/bin/fslwish FSLLOCKDIR= FSLDIR=/usr/local/fsl FSLTCLSH=/usr/local/fsl/bin/fsltclsh FSLCONVERT=/usr/bin/convert FSLMULTIFILEQUIT=TRUE FSLREMOTECALL= FSLMACHINELIST= FSLGECUDAQ=cuda.q FSL_BIN=/usr/local/fsl/bin FSLOUTPUTTYPE=NIFTI_GZ
これらは
. ${FSLDIR}/etc/fslconf/fsl.sh
がシステムにログインした時に読み込まれているからなんです。
以上、たった4行(コメントをいれたら5行)ですが、このFSLの設定が、大事なことをいくつもしているということを文章にしてみました。
こういうものの読み解き方を知るだけで、UNIX系OSがどのように動くかを理解できるので、参考になれば幸いです。