シェルとは
シェル (shell) とは、ユーザからの指示を受けて様々なプログラムの起動や制御を行なうプログラムのことです。
言ってみれば、ユーザと OS (Operating System) 上の各プログラムとの間で仲介役をしてくれているプログラムです。
UNIX 系システムで「シェル」と言えば、一般的に CUI (Command line User Interface) を持っており、ここでの対象となるソフトウェアのコンパイルやインストールといった作業は、全て CUI で行なわれることを前提としています。
シェルの種類
現在 UNIX 系システムで、一般的によく使われているシェルは大別して三種類あると思います。
- B Shell (Bourne Shell) 系。(/bin/sh, bash など)
- C Shell 系。(/bin/csh, tcsh など)
- その他。(zsh など)
まずは、自分でどのシェルを使用しているのかをきちんと把握しておきましょう。その理由は、シェルによる微妙な違いがあるからです。特に環境変数の設定や削除は、インストール作業をしていると必要なる場合があります。自分が使用しているシェルでのその方法はぜひ身に付けておきましょう。
ここでは、B Shell 系シェルと C Shell 系シェル両方での環境変数の設定と削除の方法を解説しています。ただし zsh など、上記で「その他」に分類したシェルについては、著者は使用したことがないという理由から省かせていただきます。
環境変数の設定
例として、環境変数 CFLAGS に -O2 という値を設定したいとします。その場合 B Shell 系シェルを使用している場合は以下のようにします。
$ CFLAGS=-O2 $ export CFLAGS
上記は二行に分けて記述しましたが、以下のようにセミコロン(;)で分けて一行で記述することもできます。
$ CFLAGS=-O2; export CFLAGS
もし使用しているシェルが bash でしたら、まとめて以下のようにして設定することもできます。
$ export CFLAGS=-O2
一方 C Shell 系シェルの場合ですと、組込みコマンド setenv を使用して以下のようになります。
$ setenv CFLAGS -O2
インストール作業などをしていると、一時的にだけ環境変数を設定もしくは変更して、コマンドを実行したいことがあります。
ここでは例としてタイムゾーンである環境変数 TZ の値を一時的に GMT に設定して、コマンド date を実行してみます。まず B Shell 系シェルでは以下のように実行します。
$ TZ=GMT date Thu Nov 20 14:31:15 GMT 1997
この設定はコマンド date を実行した、そのときだけ有効であり、それ以後には環境変数 TZ の変更は影響しません。
C Shell 系シェルの場合はコマンド env を使って、以下のように実行します。
$ env TZ=GMT date Thu Nov 20 14:32:12 GMT 1997
もしくはカッコで囲むことにより一時的な環境設定を行なってコマンドを実行することができます。
$ (setenv TZ GMT; date) Thu Nov 20 14:32:46 GMT 1997
どちらの方法でも、B Shell 系シェルと同じくコマンド date を実行した、そのときだけ有効であり、それ以後には影響しません。
なお、コマンド env を使用した方法は B Shell 系シェルでも使うことができます。
上記では環境変数に一つの単語を設定するだけでしたが、二つ以上の単語を設定したい場合はシングルクォート('')かダブルクォート("")で囲む必要があります。例として、環境変数 CFLAGS に -O2 -Wall という値を設定したいとします。B shell 系シェルの場合は以下のようになります。
$ CFLAGS="-O2 -Wall" $ export CFLAGS
C Shell 系シェルの場合も同様にシングルクォート('')かダブルクォート("")で囲みます。
$ setenv CFLAGS "-O2 -Wall"
シングルクォート('')とダブルクォート("")は、多くの場合は同様の働きをします。違いを知るために以下に例を挙げます。
$ CFLAGS='-O2 -Wall' $ LDFLAGS='$CFLAGS -s' $ echo $LDFLAGS $CFLAGS -s $ LDFLAGS="$CFLAGS -s" $ echo $LDFLAGS -O2 -Wall -s
つまり、ダブルクォート("")は囲んだ文字の中にダラー($)で始まる変数(式)があるとそれを置換しますが、シングルクォート('')はその置換を行ないません。
インストール作業においては、このあたりの違いが必要となる場面はあまりありません。しかし何らかのシェルスクリプトを書く際などには必要となる基本知識なので憶えておくと良いでしょう。
環境変数の確認
前述したコマンド env のもう一つの使い方に、現在設定している環境変数を出力させる、というものがあります。
$ env PWD=/home/yokota USER=yokota MAIL=/var/mail/yokota TERM=kterm HOME=/home/yokota CFLAGS=-O2 LANG=ja_JP.ujis LOGNAME=yokota ...
コマンド env を実行すると、設定してある全ての環境変数がその値と共に出力されます。数行だけでしたらともかく、何行も出力されては目的の環境変数を簡単に見付けられない場合もあります。例えば CFLAGS だけ知りたいというような場合はコマンド grep を使用すると良いでしょう。
$ env | grep CFLAGS CFLAGS=-O2
一つの環境変数の値を知りたい場合はコマンド echo で表示させるという方法もあります。
$ echo $CFLAGS -O2
ただし、注意して欲しいのはコマンド echo での表示は環境変数だけでなく、たんなるシェル変数であっても表示させてしまうことです。以下に例を挙げます。
$ date Sat Jun 19 17:21:40 JST 1999 $ TZ=GMT $ echo $TZ GMT $ date Sat Jun 19 17:22:00 JST 1999 $ export TZ $ echo $TZ GMT $ date Sat Jun 19 08:22:07 GMT 1999
ここでは変数 TZ に GMT という値を代入しています。直後のコマンド echo での表示は GMT という値が設定されていることが確認できます。
しかしその後のコマンド date を実行すると、変数 TZ に GMT を設定した影響を受けていません。つまり GMT ではなく JST で表示されています。
そして、組み込みコマンド export を実行した後のコマンド date では GMT で表示されていることがわかります。
つまり、サブプロセス (子プロセス) が知りえるのは環境変数だけです。シェル変数はサブプロセス (子プロセス) には影響を与えません。これが環境変数とシェル変数の違いです。
今後のインストール作業では、例えば configure に CFLAGS などを伝えたい場合がでてきます。B shell 系シェルを使っている場合は、必ずコマンド export を使って環境変数にしておくことを忘れないようにしましょう。
C shell 系シェルの場合は、環境変数は組み込みコマンド setenv で設定しますが、シェル変数はコマンド set で設定します。設定に使用するコマンドが違うので間違いはあまり発生しないと思います。
環境変数の削除
例えば、環境変数 CFLAGS を削除したい場合、B Shell 系シェルですとコマンド unset を用いて以下のように実行します。
$ unset CFLAGS
C Shell 系シェルの場合は組み込みコマンド unsetenv を用いて以下のように実行します。
$ unsetenv CFLAGS
もし一時的にだけ環境変数を削除して、コマンドを実行したい場合、カッコで囲んで実行する必要があります。
B Shell 系シェルの場合は以下のように実行します。
$ (unset TZ; date)
C Shell 系シェルの場合は以下のように実行します。
$ (unsetenv TZ; date)
どちらの方法でも、コマンド date を実行した、そのときだけ有効であり、それ以後には影響しません。