技術コミュニティの大部分は、コマンドラインインターフェース(CMD)またはシェルを介してシステムとやり取りすることを好みます。一般的に、これにより作業が容易になります。例えば、GUIの複数のボタンをクリックする代わりに、複数のタスクを自動的に実行するシェルコマンドを作成できます。
シェルやCMDプログラムを起動すると、いくつかの情報が収集されます。この情報は、プログラムが基盤となるシステムリソースにアクセスする方法や、全体的な動作を設定します。これは「環境」と呼ばれる場所に保存できます。環境は、キーと値のペアを表す文字列で構成されています。このチュートリアルでは、Ubuntu 20.04 VPS を例として使用し、環境変数またはシェル変数の設定手順を説明します。このガイドは、他のLinuxディストリビューションにも適用できるはずです。
環境変数とシェル変数の違いは何ですか?
セッションを開始すると、システムの設定や構成ファイルから情報が収集されます。その後、その情報はシェルプロセスおよびその子プロセスで利用可能になります。この情報は、次の形式のキーと値のペアのセットです:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
変数の名前(すなわちキー)は、大文字と小文字を区別します。ただし、慣例的に大文字で表記することが一般的です。これにより、他のコンテキストと区別しやすくなります。コロン ‘:’ 文字を使用すると、同じ変数に複数の値を割り当てることができます。また、 = の前後にスペースを入れないようにすることも重要です。キーは変数であり、環境変数とシェル変数の2つに分類されます。環境変数には、システム全体で定義され、すべての子シェルまたはプロセスで利用可能なすべての変数が含まれます。これらは、シェルコマンドを介して開始するプロセスに情報を渡すのに役立ちます。シェル変数には、特定のシェルセッションで定義された変数のみが含まれます。さらに、それらのシェルインスタンス内でのみ排他的に利用可能な変数のみが含まれます。
環境変数とシェル変数のリスト表示
デフォルトでは、ターミナルは環境変数とシェル変数をリスト表示するための2つのコマンド(envまたはprintenv)を提供します。これらはデフォルトの状態では同じ情報を表示します。以下は、これらのコマンドからの出力例です:
envの使用:

printenvの使用:

ご覧の通り、出力は同じです。違いは、特定のキーの値を取得したい場合に生じます。その場合は、変数の名前を指定してprintenvを使用します:

複数の値を表示するには、printenvコマンドに複数の引数を渡すことができます。値は、引数を入力した順に表示されます:

変数名とともにechoコマンドを使用して、変数の値を表示することもできます:

envコマンドを使用すると、次のような構文で変数定義を渡すことにより、プログラムが実行される環境を変更できます:
|
1 |
env VAR1="var 1 value" command_to_run command_options |
これにより、値を上書きしたり、子プロセスで使用できる新しい値を設定したりできます。printenvおよびenvコマンドは、上記のように環境変数をリスト表示します。これらはすでにシステムプロセス用に定義されていました。シェル変数のリストを表示したい場合は、setコマンドを使用できます。変数を指定せずにsetと入力すると、すべての環境変数、シェル変数、ローカル変数、およびシェル関数の一覧が返されます:

変数が多すぎる場合があります。必要に応じて、次のコマンドを使用してページ分割して表示できます:
|
1 |
set | less |
POSIXで実行するようにsetコマンドを指定することで、出力をさらに整理し、シェル関数を出力しないようにすることができます。ここでは、コマンドが現在の環境を変更するのを防ぐために、サブシェル(コマンドプロセッサの個別のインスタンス)で実行します:
|
1 |
(set -o posix; set) |
上記は、システムで利用可能なすべての環境コマンドおよびシェルコマンドをリスト表示します。次のコマンドを使用して出力を削減し、シェル変数のみを取得してみることができます:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
上記コマンドの出力例は以下の通りです。

このコマンドにはいくつかの環境変数が含まれる場合がありますが、シェル変数と環境変数を区別するのに役立ちます。これは、setコマンドが変数の値を引用符で囲むのに対し、printenvコマンドやenvコマンドは値を引用符で囲まないためです。シェル変数は、ファイルに変更を永続的に書き込むことなく、セッションの永続的な値を設定するのに便利です。
一般的な環境変数
USER – 現在ログインしているユーザー。
SHELL – 入力したコマンドを解釈するシェル。デフォルトはbashですが、変更することもできます。
HOME – 現在のユーザーのホームディレクトリ。
TERM – エミュレートするターミナルのタイプを指定します。現在エミュレートされているターミナルを表示します。
PWD – 現在の作業ディレクトリ。
OLDPWD – 一つ前の作業ディレクトリ。これにより、cdコマンドでディレクトリを変更する際に、シェルが前のディレクトリに切り替えることができます。
EDITOR – ターミナルでeditと入力したときのデフォルトのファイルエディタ。
LS_COLORS – lsコマンドを入力したときに色付きの出力を追加するために使用されるカラーコードを定義します。ファイルタイプを区別し、ユーザーに情報を提供するのに役立ちます。
LOGNAME – 現在のユーザーの名前。
MAIL – 現在のユーザーのメールボックスへのパスを定義します。
LANG – 現在のロケール設定を定義します。
PATH – コマンドを実行するときに検索するディレクトリのリストを指定します。コマンドの実行中、システムはこれらのディレクトリを検索し、最初に見つかった実行可能ファイルを使用します。
_ – 最後に実行されたコマンド。
一般的なシェル変数:
BASH_VERSION – 人間が読める形式のbashのバージョン。
BASH_VERSINFO – 機械が読める形式のbashのバージョン。
BASHOPTS – bashが実行されたときに使用されたオプションのリスト。シェル環境が期待通りに動作するかどうかを判断するのに役立ちます。
COLUMNS – 画面に出力を描画するために使用されている列幅の数。
DIRSTACK – pushdおよびpopdコマンドで使用できるディレクトリのスタック。
HOSTNAME – 現時点のコンピュータのホスト名。
HISTFILESIZE – ファイルに保存されるコマンド履歴の行数。
HISTSIZE – メモリ上に許可されるコマンド履歴の行数。
IFS – コマンドライン上の入力を区切るための内部フィールドセパレータ。デフォルトはスペースです。
SHELLOPTS-シェルオプションを設定するために使用されます。
UID-現在のユーザーのUID。
PS1– プライマリコマンドプロンプトの定義。これは、シェルセッションを開始したときにプロンプトがどのように表示されるかを定義するために使用されます。
PS2 – コマンドが複数行にわたる場合のセカンダリプロンプトを宣言します。
環境およびシェルコマンドの設定
まず、前述のように、変数名はすべて大文字のままにします。次に、シェル変数の作成について説明します。最後に、環境変数を作成します。
シェル変数の作成
おなじみの「hello world」から始めましょう。ターミナルに以下を入力してください。
|
1 |
MY_FIRST_VAR=’Hello World!’ |
変数にスペースが含まれているため、引用符が使用されています。感嘆符は特殊文字であり、エスケープするかシングルクォーテーションで囲む必要があるため、シングルクォーテーションを使用したことに注意してください。これで、最初のシェル変数が作成されました。これは現在のシェルセッションでのみ使用可能です。シェル変数は、子シェルやプロセスからは利用できません。grepコマンドを組み合わせたsetを使用することで、ターミナルに出力できます。

または、echoを使用し、$記号と変数名で参照して値を表示します。

printenvを使用して出力しようとしても、何も出力されません。これにより、これが環境変数ではないことを確認できます。

環境変数の作成
以前に作成したシェル変数は、exportコマンドを使用して環境変数に変換できます。まず、シェル変数を作成します。次に、環境変数を作成するには、exportコマンドを使用する必要があります。このコマンドを実行すると、変数は子シェルやプロセスから利用できるようになります。
|
1 |
export MY_FIRST_VAR |
ここで、printenvコマンドを使用してテストすると、変数と値が表示されるはずです。

次の構文を使用して、環境変数を1ステップで作成することもできます。
|
1 |
export MY_SECOND_VAR='This is my second variable' |
環境変数は子シェルにのみ渡され、親シェルには渡されません。これにより、子プロセスが自身を呼び出したプログラムの環境に影響を与えるのを防ぐことができます。
変数の降格とアンセット
ここまでのチュートリアルに従ってきた場合、MY_FIRST_VARはまだ環境変数として定義されています。-n フラグを付けて echo コマンドを入力することで、これをシェルコマンドに戻すことができます。
|
1 |
export -n MY_FIRST_VAR |
printenvでテストしても、出力はありません。しかし、まだシェルコマンドであるため、echoコマンドでは表示されます。

unsetコマンドを使用すると、シェル変数または環境変数のいずれかを解除(アンセット)できます。そして、echoを使用することで、それが存在しなくなったことを確認できます。ご覧の通り、出力は表示されません。

ログイン時の環境変数の設定
多くのプログラムは、実行時に環境変数に依存しています。プログラムを実行するたびに変数を設定するのは効率的ではないため、Linuxには変数を定義してファイルに保存する方法が用意されています。これにより、ログイン時に自動的に設定されるようになります。シェルは、セッションの開始方法に応じて異なる設定ファイルを読み込みます。これらについて以下で説明します。
シェルセッションの種類とその違い
- ログインシェルセッション – ユーザーの認証から始まります。SSHまたはターミナルセッションを介してサインインしたときにセッションが設定されます。
- 非ログインシェルセッション – 認証済みのシェル内から新しいシェルを起動したときに始まります。bashコマンドを使用して新しいシェルを起動できます。認証情報は不要です。
- インタラクティブシェルセッション – ターミナルセッションに紐付けられたシェルセッション。
- 非インタラクティブシェルセッション – ターミナルセッションに紐付けられていないシェルセッションで、バックグラウンドで実行されます。
セッションは、ログインまたは非ログイン、およびインタラクティブまたは非インタラクティブのいずれかに分類されます。SSHを介してログインし、シェルセッションを開始すると、それはログインかつインタラクティブなシェルセッションになります。ターミナルでスクリプトを実行する場合、通常は非ログインかつ非インタラクティブなセッションで実行されます。シェルセッションは、これら2つの組み合わせになることもあります。では、どの設定ファイルが選択されるのでしょうか?
ログインセッションは、まず /etc/profile ディレクトリから設定ファイルを読み込みます。次に、ユーザーのホームディレクトリからユーザー固有の設定ファイルを確認します。~/.bash_profile、~/.bash_login、~/.profile のうち、最初に見つかったファイルのみが読み込まれ、他のすべてのファイルは無視されます。非ログインセッションは、まず /etc/bash.bashrc から読み込み、次に ~/.bashrc を読み込みます。非インタラクティブセッションは、BASH_ENV という環境変数を読み取って、新しい環境を定義するために使用するファイル名を取得します。
環境変数の実装
変数を設定するときは、上記の議論に基づいて、どのファイルに配置するかに常に注意してください。これにより、特定の変数が特定のセッションでのみ使用可能になり、柔軟性が向上します。重要な変数が特定のセッションで欠落することは避けたいものです。
場合によっては、ログインセッションと非ログインセッションの両方に変数を存在させたいことがあります。幸いなことに、ほとんどのLinuxディストリビューションでは、デフォルトでログイン設定が非ログイン設定を読み込み、プロセスで利用できるように構成されています。したがって、非ログイン設定ファイルに変数を定義するだけで済みます。通常、私たちはユーザー固有の環境変数を設定し、その設定をログインシェルセッションと非ログインシェルセッションの両方で利用できるようにしたいと考えます。このため、~/.bashrc ファイルを使用します。ファイルの編集には nano を使用します。ターミナルに以下を入力してファイルを開きます。
|
1 |
nano ~/.bashrc |
開いた設定ファイルには、すでにいくつかの変数が表示されています。コマンドラインを使用するときと同じ方法で環境変数を追加できます。次のコマンドを入力するだけです。
|
1 |
export KEYNAME=値. |
これらはファイル内の任意の場所(ループ関数の内部ではなく、新しい行)に追加できます。その後、ファイルを保存して閉じます。次に開始するシェルセッションは、このファイルから読み込まれます。再起動せずに、追加したばかりの設定を現在のシェルに読み込ませたい場合は、次のコマンドを使用できます。
|
1 |
source ~/.bashrc |
システム全体の環境変数は、/etc/profile、/etc/bash.bashrc、または/etc/environmentのいずれかに追加する必要があります。
まとめ
最後に、これでシェル変数と環境変数を設定し、これらのツールがVPSにもたらす強力な機能を活用できるようになりました!これには、一部のプロセスの実行の自動化、認証情報を必要とする自動デプロイ設定、子プロセスへの変数の受け渡しなど、多くのメリットがあります。環境変数は、認証情報などの機密データを公開リポジトリなどの他のデータから隠すのに役立ちます。この基盤があれば、ユーザーが常に入力しなくても、コマンドラインから自動的に実行できる複雑なスクリプトを作成できます。
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。