LinuxのBashで環境変数を設定する方法

  • Linuxでは、環境変数を使用してターミナルウィンドウとシェルの設定と構成を定義します。
  • 環境変数には、システム全体の変数、セッション全体の変数、シェル固有の変数のなど、さまざまな種類があります。
  • 「echo」や「export」などのコマンドを使用して環境変数を表示および作成し、/etc/environmentや「.bash_rc」などの特定のファイルに追加することで、再起動後も永続的に使用できます。

Linuxには、1つ以上の種類の環境変数があります。それらを表示する方法、ローカルログインとリモートログイン用に作成する方法、および再起動後も永続的に使用する方法を学習します。

環境変数の仕組み

ターミナルウィンドウとその中のシェルを起動すると、シェルが正しく設定されていることを確認するために、変数のコレクションが参照されます。これらの変数は、ターミナルウィンドウとシェルが参照する必要がある可能性のある情報がすべて使用可能であることも保証します。これらの変数は、コマンドプロンプトの外観まで、ターミナルウィンドウ内で見つかる環境を定義する設定を保持します。そのため、当然のことながら、それらは環境変数と呼ばれています。

環境変数の中には、システム全体、つまりグローバルなものがあります。他の変数はセッション全体であり、あなただけが閲覧できます。他の変数は、セッション環境変数を参照できません。シェル内で定義された環境変数の3つ目のセットがあります。ロケール、タイムゾーン、キーボード設定、シェルがコマンドを検索しようとする際に検索されるディレクトリのセット、およびデフォルトのエディタはすべて、シェル環境変数に格納されます。

システムに存在する環境変数の表示方法を示し、独自の環境変数の作成方法を説明します。また、それらを子プロセスで使用できるようにし、再起動後も永続的に使用する方法も示します。

環境と継承

シェルが起動すると、初期化フェーズが開始されます。この時点で、シェルの環境を定義する環境変数が読み取られます。

そのシェルからプログラムまたはコマンドが起動されると(子プロセスと呼ばれます)、親プロセスの環境が継承されますが、注意してください。説明したように、環境に追加されない変数を作成することができるので、子プロセスによって継承されません。

子プロセスがシェルである場合、そのシェルは独自の新規変数のセットから初期化されます。そのため、現在のシェルでコマンドプロンプトを変更して、子シェルを起動した場合、子シェルは親の変更されたコマンドプロンプトを継承しません。

グローバル環境変数

慣例上、環境変数には大文字の名前が付けられます。次に、グローバル環境変数の一部と、それらが保持する値が表す内容を示します。

  • SHELL:ターミナルウィンドウを開いたときに起動されるシェルの名前。ほとんどのLinuxディストリビューションでは、デフォルトから変更しない限り、bashになります。
  • TERM:ターミナルウィンドウは実際にはハードウェアターミナルのエミュレーションです。これには、エミュレートされるハードウェアターミナルの種類が保持されます。
  • USER:システムを使用している現在のユーザーのユーザー名。
  • PWD:現在の作業ディレクトリのパス。
  • OLDPWD:現在の作業ディレクトリに移動する前のディレクトリ。
  • LS_COLORS:lsによってさまざまなファイルの種類を強調表示するために使用されるカラーコードのリスト。
  • MAIL:Linuxコンピュータにメールシステムが設定されている場合(デフォルトでは設定されていません)、現在のユーザーのメールボックスへのパスが保持されます。
  • PATH:シェルがコマンドの実行可能ファイルを見つけるために検索するディレクトリのリスト。
  • LANG:言語、ローカライズ、文字エンコーディングの設定。
  • HOME:現在のユーザーのホームディレクトリ。
  • _:アンダースコア(_)環境変数には、最後にタイプされたコマンドが保持されます。

echoよりも高度な機能を使用せずに、これらの環境変数のいくつかがどのように設定されているかを確認できます。値をターミナルウィンドウに書き込みます。環境変数に保持されている値を確認するには、その名の先頭にドル記号($)を追加する必要があります。

環境変数の名前を入力補完を使用して入力できるのは便利です。名前の最初の数文字を入力して、Tabキーを押します。変数の名前はシェルによって補完されます。補完されない場合は、それらの最初の文字で始まる名前を持つ他のコマンドと環境変数を区別するために、さらに数文字を入力する必要があります。

echo $SHELL

echo $LANG

echo $HOME

echo $PWD

Linuxでグローバル環境変数を設定する

独自のグローバル環境変数を作成するには、/etc/environmentファイルに追加します。このファイルを編集するにはsudoを使用する必要があります。

sudo gedit /etc/environment

環境変数を追加するには、その名前、等号(=)、および環境変数が保持する値を入力します。等号(=)の前後にスペースを入れないでください。環境変数の名前には、文字、アンダースコア(_)、または数字を含めることができます。ただし、名前の最初の文字は数字にすることはできません。

値にスペースがある場合は、値全体を引用符(")で囲んでください。

ファイルを保存して、ログアウトしてから再度ログインします。echoを使用して、新しい変数が存在し、設定した値を保持していることをテストします。

echo $WEBSITE

グローバル環境変数なので、誰もが利用でき、ユーザーmaryは次回ログインしたときに環境変数を参照できます。

echo $WEBSITE

すべての環境変数を一度に見るには、printenvと入力します。出力が多いため、sortでパイプ処理して、lessに送るのが理にかなっています。

printenv | sort | less

環境変数のソートされたリストがlessで表示されます。

出力をgrepでパイプ処理して、特定のトピックに関連する環境変数を検索できます。

printenv | grep GNOME

便利なBash環境変数

これらは、bashで使用され、その動作と機能を指示または記録するために使用されるシェル環境変数のいくつかです。ターミナルを使用すると、値の一部が更新されます。たとえば、COLUMNS環境変数は、ターミナルウィンドウの幅に加えた変更を反映するように更新されます。

  • BASHOPTS:bashの起動時に使用されたコマンドラインオプション。
  • BASH_VERSION:単語と数字の文字列としてのbashのバージョン番号。
  • BASH_VERSINFO:数字としてのbashのバージョン。
  • COLUMNS:ターミナルウィンドウの現在の幅。
  • DIRSTACK:pushdコマンドによってディレクトリストックに追加されたディレクトリ。
  • HISTFILESIZE:historyファイルで許可される行の最大数。
  • HISTSIZE:メモリ内で許可されるhistoryの行数。
  • HOSTNAME:コンピュータのホスト名。
  • IFS:コマンドラインで入力を区切るために使用される内部フィールド区切り記号。デフォルトでは、これはスペースです。
  • PS1:PS1環境変数には、プライマリ、デフォルト、およびコマンドプロンプトの定義が含まれています。コマンドプロンプトの定義には、エスケープシーケンスと呼ばれるトークンのセットを含めることができます。これらは、ホスト名とユーザー名、現在の作業ディレクトリ、および時刻などのものを表します。
  • PS2:コマンドが複数行にまたがり、さらに多くの入力が期待されている場合、セカンダリコマンドプロンプトが表示されます。PS2環境変数にはこのセカンダリプロンプトの定義が含まれています。デフォルトでは、これは大なり記号(>)です。
  • SHELLOPTS:setオプションを使用して設定できるシェルオプション。
  • UID:現在のユーザーのユーザーID。

これらのシェル変数のいくつかを確認してみましょう。

echo $BASH_VERSION

echo $HOSTNAME

echo $COLUMNS

echo $HISTFILESIZE

echo $UID

完全を期すために、コマンドプロンプトの定義で使用できるトークンを次に示します。

  • \t:現在の時刻をHH:MM:SSの形式で書式設定したもの。
  • \d:曜日、月、日付で表される現在の日付。
  • \n:改行文字。
  • \s:シェルの名前。
  • \W:現在の作業ディレクトリの名前。
  • \w:現在の作業ディレクトリのパス。
  • \u:ログインしているユーザーのユーザー名。
  • \h:コンピュータのホスト名。
  • \#:シェル内の各コマンドには番号が付けられています。これにより、コマンドプロンプトでコマンドの番号を確認できます。これは、コマンドがhistoryリストに持つ番号と同じではありません。
  • \$:通常ユーザーの場合はプロンプトの最後の文字をドル記号($)に、ルートユーザーの場合はハッシュ記号(#)に設定します。これは、ユーザーのUIDを確認することで機能します。ゼロの場合、ユーザーはルートです。

PS1環境変数の定義は.bashrcファイルにあります。

このセクションでは特にBashについて説明していますが、ZSHなどの他のシェルでも考え方は同じです。ただし、シェル変数には違いがあります。

Bash環境変数を設定する

独自の環境変数を作成するには、.bashrcファイルの末尾に追加します。SSH接続などのリモートセッションで環境変数を使用できるようにするには、.bash_profileファイルにも追加する必要があります。

環境変数の定義の形式は、どちらのファイルでも同じです。.bash_profileファイルに定義を追加するには、ホームディレクトリで次のように入力します。

gedit .bashrc

INHERITED_VARという環境変数を追加しました。行の最初に「export」という単語があることに注意してください。

編集が完了したら、ファイルを保存して閉じます。ログアウトして再度ログインするか、ドットコマンド(.)を使用してシェルに.bash_profileファイルを再読込させることができます。

. .bashrc

それでは、コマンドラインで環境変数を作成してみましょう。

LOCAL_VAR="This session only"

echoを使用すると、両方の環境変数にアクセスできることがわかります。

echo $LOCAL_VAR

echo $INHERITED_VAR

INHERITED_VAR環境変数の定義の行の最初に「export」という単語があることに注意してください。これは、環境変数が現在のシェルのプロセスによって継承されることを意味します。bashコマンドを使用して別のシェルを起動した場合、子シェル内から2つの変数を再度確認できます。

bash

echo $LOCAL_VAR

echo $INHERITED_VAR

ご覧のとおり、INHERITED_VARは子シェルでアクセスできますが、LOCAL_VARはアクセスできません。空白行が表示されるだけです。

「export」は環境変数部分をプロセスが継承する環境に追加しますが、INHERITED_VARはグローバル環境変数ではありません。たとえば、ユーザーmaryは参照できません。

echo $INHERITED_VAR

bashセッションを閉じるには、exitを使用します。

exit

継承された環境はスクリプトにも影響します。次に、3つの環境変数の値をターミナルウィンドウに書き込む単純なスクリプトを示します。

#!/bin/bashecho "WEBSITE" $WEBSITEecho "LOCAL_VAR" $LOCAL_VARecho "INHERITED_VAR" $INHERITED_VAR

これはenvtest.shというファイルに保存され、次のように実行可能になりました。

chmod +x envtest.sh

スクリプトを実行すると、3つの環境変数のうち2つにアクセスできます。

./envtest.sh

スクリプトはWEBSITEグローバル環境変数とINHERITED_VARエクスポートされた環境変数を参照できます。変数が作成された同じシェルでスクリプトが実行されているにもかかわらず、LOCAL_VARにはアクセスできません。

必要に応じて、コマンドラインから環境変数をエクスポートできます。LOCAL_VARに対して行い、スクリプトを再度実行します。

export LOCAL_VAR

./envtest.sh

環境変数は現在のシェルの環境に追加されたため、スクリプトによって継承される環境に表示されます。スクリプトはその環境変数も参照できます。

リモート接続

グローバル環境変数はリモートログインセッションでアクセスできますが、ローカルで定義された環境変数をリモートで使用できるようにするには、.bash_profileファイルに追加する必要があります。.bashrcファイルと.bash_profileファイルで同じ環境変数を異なる値で設定できます。これは、スクリプトによって取得され、システムをローカルまたはリモートで使用している人々の動作を変更するために使用できます。

(混乱を招く可能性がありますが、.profileファイルもあります。環境変数の定義を保持することもできます。ただし、.bash_profileファイルが存在する場合、.profileファイルは読み取られません。したがって、最も安全な方法(およびbashに準拠する方法)は.bash_profileファイルを使用することです。)

.bash_profileファイルを編集するには、再びgeditを使用します。

gedit .bash_profile

以前に使用したものと同じ値で同じ環境変数を追加します。

変更を保存してgeditを閉じます。

別のコンピュータで、テストコンピュータへのSSH接続を行います。

ssh [email protected]

接続したら、スクリプトをもう一度実行します。

./envtest.sh

リモートログインの初期化の一環として.bash_profileファイルが読み取られ、INHERITED_VAR環境変数は私たちとスクリプトがアクセスできます。

環境変数の設定解除

環境変数の設定を解除するには、unsetコマンドを使用します。グローバル環境変数WEBSITEとエクスポートされた環境変数INHERITED_VARの設定を解除すると、コマンドラインや子プロセスでは使用できなくなります。

unset WEBSITE

unset INHERITED_VAR

./envtest.sh

echo $WEBSITE

これは、このセッションのグローバル環境変数の可用性のみが変更されることに注意してください。同時にログインしている別の人は、そのグローバル環境変数のインスタンスに引き続きアクセスできます。彼のインスタンスは初期化され、ログインプロセス中に/etc/environmentファイルから読み取られ、他の人の変数のコピーとは無関係です。

たとえば、ユーザーmaryは、ユーザーdaveがセッションでunsetしたにもかかわらず、WEBSITE環境変数にアクセスしてその値を読み取ることができます。

echo $WEBSITE

環境制御

環境変数を使用して、スクリプトやアプリケーションに動作方法を知らせることができます。設定や少量のデータを格納するために使用できます。たとえば、スクリプトは、他のスクリプトが参照できる値で環境を設定できます。ファイルに書き込む必要はありません。