今回は、bashが標準的に利用するシェル変数を解説する。bashは、コマンドラインを制御するためのシェルであると同時にスクリプト作成のためのプログラミング言語でもある。シェル変数とは、bashという言語が持つ変数を指す。
変数なので、ユーザーが自由に使うことができるが、bashには、あらかじめ用途が決められている変数名がある。これをBash Reference Manualでは、「Bash変数」(Bash Variables)と呼ぶ。また、bashの先祖ともいえる「Bourne shell」から引き継いだ変数もあり、これらは「Bourne shell変数」(Bourne Shell Variables)と呼ばれる。ここでは、便宜的に両者を「自動シェル変数」と総称することにする。
この自動シェル変数には、bashが初期化を行い、bash内部の情報などをスクリプトやコマンドラインに対して提供するためのもの、ユーザーが設定を行い、bashの振る舞いなどを設定するもの、の大きく2種類がある。
(表01)は、bashが利用するシェル変数をアルファベット順に並べたもの。大半が大文字になっている。一応、Linux/Unix系では、大文字の変数名は定数または読み出し専用の変数、あるいはシステムから提供される特殊変数を表す。これに対して、ユーザーが定義して読み書きする変数には小文字を使う。自動シェル変数の大半が大文字なのは、基本的には、定数として扱うことを示す。また、予約済みの変数でも、大文字を使うのは、初期化スクリプト(.bashrcなど)で設定を行うため、コマンドラインでは定数として扱うべきであることを示す。
変数名に複数の単語を含める場合のスタイルはいろいろあるが、bashでは、アンダーバーで区切る流儀が標準的だ。しかし、過去からの監修で用途などを表す短い「プリフィックス」に単語を組み合わせた変数名が使われることもある。
逆に言うと、単語の先頭文字を大文字として後ろに小文字を使うような流儀(キャメルケース)はbashでは使わない。もちろん、ユーザーが使う分には自由ではあるが。
自動シェル変数を分類する
自動シェル変数は多数あるため、まずは、役割ごとに分類してみた。この分類は筆者が行ったもので、bashの公式なドキュメントなどに記述があるものではない。
(表02)は分類名と役割を示す。この記事では、自動シェル変数を大きく9つに分類した。
分類して整理した自動シェル変数を表03、表04に示す。
表の「名称」が自動シェル変数の名前である。「初期化/予約」は、自動シェル変数の値の設定をbashが行うもの(初期化)、bashは初期化を行わないが用途が決まっている(予約)のどちらであるかを示す。
なお、予約の自動シェル変数であっても、初期化スクリプトで値が設定されることが多く、bashの起動時にはすでに初期化が完了していることがある。逆にいうと「予約」のシェル変数は、bash起動前に環境変数として定義する、あるいは初期化スクリプトで値を定義することで、bashの振る舞いを変更することができるものだ。
以下のファイルがbashの初期化スクリプトである。この中のどこかで予約済みの自動シェル変数を設定している可能性がある。
/etc/Profile
/etc/bash.bashrc
/etc/profile.d以下のスクリプト
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
「LostProp」は、初期化される自動シェル変数のうち、unsetで消去してしまうと、以後、そのセッションでは、同名のシェル変数を定義しても効力を失うものを示す。
「ReadOnly」は、変数が読み出し専用かどうかを示す。ReadOnlyとされている変数は、「変数名=値」で上書きする、あるいはunsetによる消去がエラーとなる。
また一部の変数は、書き込みを無視し、値を上書きさせないが、エラーにはならない。
読み出し専用とされていない変数は、その性質から上書きなどが適さない場合でもエラーにはならない。ただし、上書きの結果、正しい値にならない場合がある。基本的には、「初期化」と指定されたシェル変数は上書きしないようにする。
「環境変数」は、該当のシェル変数が環境変数になっていることを示す。環境変数とシェル変数は、操作上の違いはないが、環境変数になっているものは子プロセスに引き継がれる。これに対してシェル変数は実行中のセッション内だけで有効で、子プロセス(子シェル)には引き継がれない。
「Bourne」は、bashの前身であるBourneシェルから引き継いだシェル変数を示す。
なお、「解説」は、表示の関係から簡易なものになっている。詳細な解説に関しては、bashのmanページを参照するか、インターネットにあるBash Reference Manualの「5 Shell Variables」(英語)を参照されたい。
自動シェル変数には、いくつか配列/連想配列になったものがある。この場合、「$変数名」では、値を表示できないため、以下のようにする。
echo "${BASH_ALIASES[*]}"
シェル自動変数は、多くの場合、スクリプト内などで参照することが多く、コマンドラインで直接使うことは少ないだろう。ただ、予約済みの変数に関しては、~/.bashrcなどで見ることになる。このときも変数名が大文字なので、一時的な値を保持するようなシェル変数とは区別がつけやすい。
≫ Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/