支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • Linuxの環境変数・シェル変数につ

はじめに

OS(operating system)は、パソコンやサーバーの基本となるソフトウェアのことであり、メモリ・ディスク管理やネットワーク通信、制御等を行います。メモ帳やエクスプローラー、表計算ソフト、デザインソフトといった各種アプリケーションソフトウェアは、このOS上ではじめて動作が可能となるので、コンピュータにおいてOSはそれだけ重要な役割を担っています。OS上では常に、様々なタスク(プロセスや処理とも言い表せる)が必要なデータを共有しながら同時に動作していることがほとんどです。この記事では、タスク同士が様々なデータを共有するために必要な「環境変数」「シェル変数」という仕組みについて紹介します。これからサーバーエンジニア、インフラエンジニアを目指そうと思っている方、変数の存在は知っているものの、いまいち仕様がわからず使いこなせていないという方は、ぜひご覧ください。なお今回はLinuxOSに特化した内容となること、あらかじめご注意ください。

Linux系OSについて

先にLinux系OS自体について簡単におさらいしておきます。Linuxはカーネルとディストリビューションという2つの仕組みで動作します。「カーネル」は他のOS同様、ハードウェアの制御やメモリー、プロセスの管理等を行うOSのコアインターフェースとなる部分です。実は「Linux」という名称は、OSの種類というよりもこのカーネルのことを指す言葉となります。一方の「ディストリビューション」は、この「Linux」というカーネルで動かすことができるソフトウェアを複数組み合わせたパッケージのようなものを指します。ディストリビューションはDebian、CentOS、Fedora、Ubuntuと多くの種類があり、それぞれに利用できるソフトウェアや仕様が異なります。Windows等の他のOSと比較すると、無料、有料含めディストリビューションが豊富でユーザーやシステムに適したものを選択できるというのは、Linuxの大きな特徴と言えます。あくまで「Linux」は一つであり、配布形式(ディストリビューション)が複数あるという状況ではあるものの、便宜上、ディストリビューションはそのままLinuxの種類として紹介されることも多いのでご注意ください。

環境変数とは?

コンピュータに動作内容を命令できるソフトウェアのことを「シェル」と呼び、OS上では常に多数のシェルが実行されてシステムが運用されています。そしてシェルが実行される際は、あらかじめ設定されている変数の情報を参照します。各シェルが共通して参照可能な変数が「環境変数」であり、逆に一つのシェル内でしか参照できない変数を「シェル変数」と呼びます。そのため、全体に反映させたい変数は環境変数として設定し、特定のシェルだけで反映させたい場合はシェル変数に指定することとなります。Java等のオブジェクト指向言語において、変数が参照できる範囲のことを「スコープ」と呼び、そのうちプログラム全体から参照できるものをグローバルスコープ、一つのメソッド内でしか参照できないものをローカルスコープと呼びますが、その仕組みと似ています。

上記でJavaの例を出しましたが、これまでにJavaの開発環境をインストールしたことがある方は、すでに環境変数の設定に触れている可能性があります。Javaは開発キットのJDK(Java Development Kit )をインストールした後に、利用しているコンピュータの環境変数にJavaの設定を加えるためです。Javaでシステム開発を行う際は、コンパイルや実行を繰り返し行いますが、環境変数を設定していないと、毎回フルパスを指定して実施することになります。その手間を省くために、「PATH」という変数にあらかじめそのパスを設定しておきます。また「LANG」という環境変数に言語を設定しておくこともあるでしょう。例えば「ja_JP.UTF-8」と設定しておくと、今後実行されるシェルは全て、UTF-8の日本語での出力が可能となります。

すでに定義済の変数について

数学やプログラミング言語で変数を利用する場合と同様、環境変数でもx、y、Student等の変数名を指定します。またプログラミング言語で、すでにシステム上で使用されているために変数名として使えない「予約語」と言われる文字列があるのと同様、環境変数でも利用できない文字列というものがあらかじめ決められているので、基本的なものを紹介します。

ホームディレクトリを表す「HOME」、ホスト名を表す「HOSTNAME」、コマンド履歴の再代数を表す「HISTSIZE」、ユーザー名を表す「USER」、ユーザーIDを表す「UID」、コマンドのパスを表す「PATH」、現在いるディレクトリのパスを表す「PWD」、タイムゾーンを表す「TZ」等の変数名が利用できません。今回挙げた変数名は独自に作成できないのと同時に、重要な情報が格納されている部分でもあるので、ぜひ覚えておくことをおすすめします。なお、環境変数の変数名は多くの場合、大文字で表されます。大文字でないと認識されないというわけではないですが、環境変数であることを明示するためにも大文字とした方が良いです。また、例えば小文字の「hensu01」と大文字の「HENSU01」があった場合、両者は別の変数として認識されることにご注意ください。

環境変数の設定ルール

繰り返しとなりますが、特定のシェル内でしか参照できないのがシェル変数で、その他シェルでも参照できるのが環境変数です。そのため環境変数には、環境変数であることを識別させるために独自の定義方法を行う必要があります

まず環境変数は、プログラミング言語での記述とは違い、定義する際に「test=1」というように記述します。一見違いがわかり辛いかもしれませんが、「=」の前後に半角スペースが入っていません。プログラムの見やすさから半角スペースを入れる癖がある人がいますが、環境変数の定義で半角スペースが入るとエラーとなることにご注意ください。

また、環境変数として識別させるためには「export」を利用して「export 変数名」というように記述します。記述の一例を挙げると「export NAME」のようになります。変数の指定と同時に値を格納したいのであれば「export 変数名=値」で可能となるので、「export NAME=Yamada」のような記述となります。なお環境変数の値を別のシェルで変更することは可能ですが、その値はあくまで実行中のシェル内でのみ有効で、大元の環境変数の値が変更されることはありません。環境変数の値を変更したい場合は、必ず直接修正が必要です。

環境変数がプログラミング言語における変数と異なる部分がもう一点あります。それは型を指定することなく、文字列や数字、別の変数等、様々な値を定義できるという点です。プログラミング言語ではint、string、boolean等、型の仕様を覚えなければなりませんが、考慮しなくていい点は便利です。

環境変数の値には変数を指定することも可能ですが、文字列ではなく変数として認識させたい場合は「``(バックフォート)」で囲む必要があります。例えば「date」が変数である場合は、「VAR=`date`」となります。

環境変数を扱う際に覚えておいた方が良いこと

環境変数を設定する際に、合わせて覚えておくと便利なことについて紹介しておきます。一つ目は、変数に設定した値を確認する方法です。表示させたい場合は、PHP言語のプログラミング等でも利用する「echo」をコマンドとして使用します。「echo $NAME」というように「$」の後に変数名を指定すると、その変数に設定されている値が確認できます。

また、設定した環境変数全てを一覧で確認したい場合は、「printenv」または「env」コマンドを引数なしで実行します。「declare -x」というコマンドでも同じく一覧の表示が可能です。なお「echo」は通常の変数も表示させることができますが、「printenv」「env」は環境変数のみ表示可能です。「printenv」「env」で特定の変数の中身を確認したい場合は、「printenv NAME」のように「$」無しで変数を指定します。環境変数とシェル変数の一覧を表示させたい場合は「set」コマンドを利用します。さらに変数を削除できる「unset」というコマンドもあり、削除したい変数を「unset NAME」のように「$」無しで指定することで削除可能です。「unset」の場合は変数自体を削除してしまいますが、「export」で環境変数とした変数をシェル変数に戻したい場合は「export」にnオプションを付けて「export -n NAME」と実行します。

また、コマンドで都度変数を設定しなくても、設定ファイルに直接書き込むことで、シェル実行時に都度参照されるようになる方法があります。環境変数を書き込むファイルは「~/.bash_profile」、シェル変数を書き込む場合は「~/.bashrc」となることを覚えておきましょう。

まとめ

今回見てきたように、Linuxにおける環境変数・シェル変数は様々なルールがあるため、初めて触れる場合はその仕様やルールを覚えるまでに時間がかかることでしょう。実際、今回紹介したこと以外に環境変数の設定で利用するコマンドや記号、記述はたくさんあります。なお、環境変数はOSの重要な設定がされている部分でもあるので、取り扱いは慎重に行う必要があります。しかし環境変数の設定方法は、WindowsOSや、プログラミング言語の開発環境を設定する際などにも役立つ知識となります。そのためまずは今回の記事をきっかけに、基礎となる知識を正しく理解しておくことをおすすめします。また、しばらく触れていないと忘れてしまいがちな部分でもありますが、そういった折にはぜひ今回の記事を振り返ってみていただけると幸いです。