28 I君への講釈

(工事中 -- 出来上がるのはしばらく後になる予定)


ターミナルを使っているときは、 ユーザーの相手はシェルというプログラムがしている。

キーボードからの入力をコマンドとして受け取って、必要なプログラムを呼び出し、 その実行結果を画面表示させる、というのがシェルの主な仕事である。

Mac の場合、Mojave までは、bash というプログラムが標準のシェルであった。

シェルは起動の仕方が色々ある。

ログインシェル
「ログインした時に起動されるシェル」 ずっと以前はログインするとまずシェルが起動されたものだけれど… 最近だと、ターミナル等で開くウィンドウやタブで起動されるシェル、 と理解すべきか。
対話的シェル (インタラクティヴ・シェル)
いわゆるシェル・エスケープ等で起動されるシェル。 (例えば emacs で M-x shell とするとか、gnuplot で !ls とするとか。 かなあ?)
非対話的シェル
スクリプト (シェル・スクリプト) を実行するために起動されるシェル。 (特に sh という名前で起動されたときは、 設定ファイルは一切読まない。)

シェルは、色々な初期設定をファイルに書いておくことが出来る。

bash の場合、使えるのは…実はたくさんある。

まず、/etc/profile はシステム管理者が用意するもので、 存在すれば、全員がログインした時に実行される。

対話的ログインをする場合、 次の順にファイルを探し、最初に見つかったものを実行する。

(a)
~/.bash_profile
bash 専用である。
中で .profile を探して見つかれば実行するように書け、 と言われている。
test -r ~/.profile && . ~/.profile
そうしていないものが良くある。
中で .bashrc を探して見つかれば実行するように書け、 と言われている。
test -r ~/.bashrc && . ~/.bashrc
(b)
~/.bash_login
(c)
~/.profile
これはもともと /bin/sh で使われていた設定ファイル。 「シェルの種類によらない設定を書け」と言われる。 その説明はちょっと時代錯誤?

これらには環境変数の設定などを書くように言われている。 逆にこれ以外 (例えば .bashrc など) では、 環境変数の設定はしないように言われている (引き継ぎが出来なくなるから)。

一方、~/.bashrc には、 エイリアスやプロンプトなどの設定を書く。 標準出力、標準エラー出力に出力するような命令を書いてはいけない、とされる。

~/.bash_profile
ユーザーが必要と思ったら用意する。ログイン時に存在すれば読まれる。 ~/.login
ユーザーが必要と思ったら用意する。ログイン時に、 これが存在して、 ~/.bash_profileが存在しなければ読まれる。 /etc/.profile
ユーザーが必要と思ったら用意する。 これが存在して、 ~/.bash_profile~/.login も存在しなければ読まれる。 /etc/.bashrc
ユーザーが必要と思ったら用意する。ログイン・シェルでない対話的シェル では、 つねに読まれる。

~/.bash_profile~/.bashrc を使うのがお勧めなのかな??


現象数理学科の学生が時々はまっている問題。 現象数理学科 Mac は、最初に .profile を用意している。 次のような内容である。
PATH=$PATH:~/bin
export PATH

# MacPorts Installer addition on 2014-03-04_at_11:03:51: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.

ところが、anaconda をインストールすると、 ~/.bash_profile を作るらしい(本当?)。しかし そうすると ~/.profile は読まれなくなってしまう?
test -r ~/.profile && . ~/.profile
とか書いてくれない。もしかして、 .profile に書くようにしたのは選択ミス?


注意 以前は、ソフトウェアをインストールしたときに、 コマンドのあるディレクトリィの設定を、 シェルの設定ファイル中にある環境変数 PATH の設定で行うのが普通であった。 しかし、最近は /etc/paths.d にディレクトリィの 名前を書いたファイルを置いておく、というやり方が使われている (TeX, FreeFem++, XQuartz, Mathematica関係などなど、 例外は、MacPorts, Anaconda 関係などなど)。 システムの方で用意してある環境変数 PATH に、 自分が必要なディレクトリィを加える、という方針で設定ファイルを書く必要がある。

桂田 祐史
2020-04-20