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