next up previous contents
: パイプとリダイレクション : シェルの基本操作 : コマンドヒストリとコマンドやファイル名の補完   目次


環境変数とシェル変数

前節(§2.3.3節)で、コマンドの補完について説明しました。 では、シェルは、どこにあるコマンドを捜して、補完を行なったりや候補として 表示しているのでしょうか? また、man コマンドで、ページャとして、jless を使うのは、どこに書かれているのでしょうか?

これらは、環境変数(environment variable)というもので制御されて います。シェルはもちろんそうですが、シェルだけでなく、多くのアプリケーショ ンプログラムも、環境変数の値によって、その動作を変えるように作られていま す。環境変数は、printenv コマンド 55 で見られます。printenv に引数を与えなけ れば、すべての環境変数を表示し、環境変数の名前を引数で与えれば、その環 境変数のみを表示します。環境変数を定義するには、setenv コマンドを使います。 環境変数を定義をクリアーするためには、unsetenv コマンドを使います。

  % printenv 
  USER=ohba
  LOGNAME=ohba
  HOME=/home/ohba
  PATH=/home/ohba/bin:/usr/local/jdk/bin:/usr/local/bin:/usr/X11R6/bin:
   /usr/local/sbin:/usr/games:/usr/bin:/usr/sbin:/bin:/sbin
  MAIL=/var/mail/ohba
  SHELL=/usr/local/bin/tcsh
  OSTYPE=FreeBSD
  EDITOR=vi
  PAGER=jless
  ... (以下、省略)
  % setenv EDITOR emacs
  % printenv EDITOR
  emacs
  %
重要な環境変数について説明します。

HOME
ユーザーのホームディレクトリです。cd コマンドを引数なしで起 動すると、ここに戻ります。シェルは、コマンドラインで、 ~を見つけると、HOME の値に置き換えます。
PATH
コマンドを捜す順番です。: で分けて書かれていて、同じ名前の プログラムが複数ある場合には、最初に見つかったものが実行されます。
EDITOR
chfn(フルネームの変更) や chsh(ログインシェルの変更)、 less で vキーを押した場合など、アプリケーションプログラムが エディタを立ち上げて編集することが必要な場合に、 ここで設定されたエディタが立ち上がります。 stex の デフォルト設定では、emacs が指定されていますが、 vi の方が軽いので、vi が使えるようになったら、vi を指定した 方が快適です。
PAGER
man など、ページャを必要とするアプリケーションプログラムが、 この設定を呼んで、ページャを起動します。
LANG
アプリケーションプログラムのメッセージの出力などの言語の指定 です。C を指定すると、アプリケーション固有のメッセージ(ほと んどの場合、英語)で出力されます。stex のデフォルト設定では、 日本語の ja_JP.eucJP が指定されています56
シェルが、コマンドを捜す順番は、環境変数 PATH に書かれた順番に従います。 通常は、ホームディレクトリの bin というディレクトリを、PATH の最初に設定し、 自分用のプログラムを作成した場合には、~/bin ディレクトリ に 置くようにします57。あるプログラムやコマンドを入力 した場合に、実際にどこにあるものが実行されるのかは、which コマンドで調べ ることができます。
  % which less
  /usr/bin/less
  % which jless
  /usr/local/bin/jless
  % which printenv
  printenv: シェルに入っているコマンドです.


練習 2

環境変数 LANG の値を、C と ja_JP.eucJP で、シェルや、アプリケー ションの挙動がどう変わるか調べてみよう。コマンドとしては、 date、cal、xcalender などを試してみよう。



環境変数と似たものに、シェル変数というものがあります。 環境変数が、シェルだけでなく、他のアプリケーションも参照する変数であるの に対し、シェル変数はシェルだけが使用します。また、環境変数は、あるシェル から、別なシェルやアプリケーションを立ち上げた場合に引き継がれますが、 シェル変数は引き継がれません。現在のシェル変数の一覧は、set コマンド で見ることができます。

  % set
  _       set
  ...(中略)
  autolist
  ... (中略)
  history 100
  home    /home/ohba
  path    (/home/ohba/bin /usr/local/jdk/bin /usr/local/bin
  /usr/X11R6/bin /usr/local/sbin  /usr/bin /usr/sbin /bin /sbin)
  prompt  %{^[[33m%}%m:%~%#%{^[[m%}
  ...(以下略)
  % set history=200
  % echo $history
  200
  % echo $EDITOR
  vi
  % echo $_
  echo $EDITOR

シェル変数には、set するだけで意味をもつ変数(autilist など)と、その変 数の値が意味をもつ変数(path や history など)があります。上の set の出力 の最初の行 _ (アンダースコア)という特殊なシェル変数には、tcshでは直前に 実行されたコマンドが入っています。環境変数もシェル変数も、その名前の前に、 $をつけて参照できます。

home や path などのシェル変数は、環境変数で定義されている HOME や PATH と全く同じ内容58 で、 どちらかを変えると、自動的に他方も変わります59。環境変数やシェル変数の設定は、シェルの設定ファイルの書かれて いますが、それについては§2.3.7節で説明します。