2015年第1回となる今回は「ターミナルの環境整備」について。初期設定のまま、"素"のままでは本来の機能を発揮できず、ユーザのTerminal嫌いを助長しかねないため、敢えて古典的なテーマを取りあげることにする。年初でもあり、取り組むには格好のタイミングではないだろうか。

そもそも「シェル」の役割とは

ひとくちに「ターミナル」というが、実際のところ2つのプログラムにより構成される。ひとつは「Terminal.app」で、OS XのGUIを利用したターミナルエミュレータ(CUI端末として動作するソフトウェア)だ。これが狭義のターミナルだが、その上ではもうひとつ「シェル」と呼ばれるプログラムが実行される。ターミナルエミュレータ上でシェルが実行されることで、単なる文字列に過ぎないコマンドラインが適切に解釈され、コマンドとしての機能を果たすというわけだ。

その意味でTerminal.appとシェルは不可分の関係だが、シェルは変更が可能だ。OS Xの場合、多くのLinux OS同様「bash(バッシュ)」が利用されるが、FreeBSDやNetBSDにユーザが多い「tcsh(ティーシーシェル)」も選択してもいい。ほかにも多機能な「zsh」やUNIX最初期のシェル「sh」も用意されており、必要に応じて使い分けることができる。くどいようだが、Terminal.appとは別のプログラムであり、設定も完全に分かれている。

シェルの役割は、コマンドラインの解釈と実行だけではない。キーボードからの入力を受け取り処理する機能、具体的には「ショートカットキー」(UNIXでは「キーバインド」と呼ばれることが一般的)は、シェルの担当だ。タスク管理機能やプログラム(シェルスクリプト)を実行するインタープリタとしての機能もある。

カラー表示や警告音も、シェルがターミナルエミュレータに命令することで実現される。当コラムで採用しているコマンドラインを紹介するときの表記方法 -- 行頭に「$」があるアレだ -- も、bashデフォルトのプロンプト(コマンド入力待ち状態にあることを示す記号)であり、設定を見直せば変更できる。

ただし、GUIのない時代から存在するだけに、シェルの設定は若干クセがある。環境設定パネルのようなGUIがないため、テキストファイルに記述するしかないのだ。しかも行頭が「.」で始まる通称ドットファイルのため、Finder上には表示されず、ダブルクリックで編集を開始することもできない。その内容も、UNIXの流儀を知らないユーザにとっては呪文のように見えるはずだ。

Terminal.appの環境設定画面。「開くシェル」という項目で、起動されるシェルが定義されている(デフォルトは「bash」)

まずはプロンプトの設定から

このように扱いやすいとは言い難いターミナルの環境設定だが、基本ワザさえ理解すればシェルの設定はそれほど難しくない。まずは、以下のコマンドラインをターミナルで実行してほしい。これで、テキストエディットが起動し、bashの初期設定ファイル「.bash_profile」の編集を開始できるはずだ(「~」はホームディレクトリ、「~/.bash_profile」でホームディレクトリ直下の「.bash_profile」となる)。このファイルを作成しておかないことには、システム標準の設定が適用されてしまい、bashの機能が生かされない。

$ touch ~/.bash_profile
$ open ~/.bash_profile

この方法を使えば、テキストエディットを利用して「~/.bash_profile」を作成できる

どのような設定をここに書き込むかだが、まずは以下のリストをコピー&ペーストのうえ保存してほしい。その後ターミナルを再起動すれば、プロンプトの変化に気付くはずだ。

export LANG=ja_JP.UTF-8
export PS1='\u@\h \w\n\$ '

まず、「export」は環境変数を定義するためのシェル(bash)の内部コマンド。環境変数とは、シェルが起動されたときに参照する一種のストックヤードで、変数に応じた機能が用意されている。環境変数の定義がシェル・カスタマイズの第一歩であり、作業の大半を占めると言ってもいいほどだ。

1行目の「LANG」は、シェルが表示に使う文字コードを格納しておくもので、「ja_JP.UTF-8」は日本語UTF-8を使用することを意味する。OS X標準のファイルシステム「HFS Plus」は、ファイル/フォルダ名の文字エンコーディング形式にUTF-8を使用するため、一致させておく必要があるのだ。この定義は日本語環境では必須ともいえるもので、必ず記述しておきたい。

2行目の「PS1」では、プロンプトを定義している。たかがプロンプトと思うことなかれ、bashでは27ものオプションが用意されており、ユーザ名/ホスト名や日付、現在時刻などの情報を表示できるのだ。この例ではユーザ名(\u)のあとに「@」、その直後にホスト名(\h)を出力し、スペースを1つ空けたあとでカレントディレクトリ(\w)を出力、改行(\n)してから「$」を出力、という処理を行っている。

カレントディレクトリが分かれて表示されるぶん、すっきりした印象になった

筆者は約20年におよぶ試行錯誤の結果、現在では以下のプロンプト定義に落ち着いている。時刻とユーザ名/ホスト名、カレントディレクトリそれぞれを色分けしていることがポイントだ。2行に分けて表示するのは筆者のこだわりで、こうすれば長いコマンドラインもすっきり表示できる。

export PS1='\[\e[34m\]\@ \[\e[33m\]\u@\h \[\e[32m\]\w\e[0m\n\$ '

単色表示は味気ないので、要素ごとに色分け表示している。ターミナルの印象もだいぶ変わるはずだ