重要なポイント
- 環境変数は、Linux でターミナル ウィンドウとシェルの設定と構成を定義するために使用されます。
- 環境変数には、システム全体の変数、セッション全体の変数、シェル固有の変数など、さまざまな種類があります。
- 「echo」や「export」などのコマンドを使用して環境変数を表示および作成でき、/etc/environment や「.bash_rc」などの特定のファイルに追加することで再起動後も環境変数を永続化できます。
Linux には複数の種類の環境変数があります。それらを確認する方法、ローカルおよびリモート ログイン用にそれらを作成する方法、再起動後も存続させる方法を学びます。
環境変数の仕組み
ターミナル ウィンドウと その中のシェル を起動すると、シェルが正しく構成されていることを確認するために変数のコレクションが参照されます。これらの変数により、ターミナル ウィンドウとシェルが参照する必要がある情報が利用可能になることも保証されます。これらの変数は集合的に、コマンド プロンプトの外観に至るまで、ターミナル ウィンドウ内の環境を定義する設定を保持します。したがって、当然のことながら、それらは環境変数と呼ばれます。
一部の環境変数はシステム全体またはグローバルです。その他はセッション全体に適用され、自分だけが見ることができます。他の人はセッション環境変数を参照できません。シェル内には 3 番目の環境変数セットが定義されています。ロケール、タイムゾーン、キーボードの設定、シェルがコマンドを見つけようとするときに検索されるディレクトリのセット、およびデフォルトのエディタはすべてシェル環境変数に保存されます。
システムに存在する環境変数を確認する方法と、独自の環境変数を作成する方法について説明します。また、それらを子プロセスで使用できるようにし、再起動後も永続的に保つ方法についても説明します。
環境と継承
シェルが開始されると、初期化フェーズが実行されます。この時点で、シェルの環境を定義する環境変数が読み取られます。
プログラムまたはコマンドがそのシェル (子プロセスと呼ばれる) から起動されると、親プロセスの環境が継承されますが、注意してください。これから説明するように、環境に追加されない変数を作成して、子プロセスに継承されないようにすることができます。
子プロセスがシェルの場合、そのシェルは独自の新しい変数セットから初期化されます。したがって、現在のシェルでコマンド プロンプトを変更してから子シェルを起動すると、子シェルは親の変更されたコマンド プロンプトを継承しません。
地球環境変数
慣例により、環境変数には大文字の名前が付けられます。以下に、グローバル環境変数の一部と、それらに含まれる値が何を表すかを示します。
- SHELL: ターミナル ウィンドウを開いたときに起動するシェルの名前。ほとんどの Linux ディストリビューションでは、デフォルトから変更しない限り、 これは bash になります 。
- 用語: ターミナル ウィンドウは、実際にはハードウェア ターミナルのエミュレーションです。これは、エミュレートされるハードウェア端末のタイプを保持します。
- USER: システムを現在使用している人のユーザー名。
- PWD: 現在の作業ディレクトリへのパス。
- OLDPWD: 現在の作業ディレクトリに移動する前のディレクトリ。
- LS_COLORS: ls で使用されるカラー コードのリストは 、さまざまなファイル タイプを強調表示します 。
- MAIL: Linux コンピュータにメール システムが設定されている場合 (デフォルトでは設定されていません)、これには 現在のユーザーのメールボックスへのパス が保持されます。
- PATH: シェルがコマンド実行可能ファイルを見つけるために検索するディレクトリのリスト。
- LANG: 言語、ローカリゼーション、および文字エンコーディングの設定。
- HOME: 現在のユーザーのホーム ディレクトリ。
-
_:
アンダースコア (
_) 環境変数は、最後に入力されたコマンドを保持します。
これらの一部が何に設定されているかを確認するには
、値をターミナル ウィンドウに書き込む
echo
より高度なものを使用します。環境変数が保持する値を確認するには、その名前の先頭にドル記号 (
$
) を追加する必要があります。
便利な点は、 タブ補完 を使用して環境変数名を入力できることです。名前を数文字入力し、Tab キーを押します。変数の名前はシェルによって補完されます。これが起こらない場合は、同じ文字で始まる名前を持つ他のコマンドと環境変数を区別するために、さらにいくつかの文字を入力する必要があります。
エコー $SHELL
$LANGをエコーする
エコー $HOME
エコー $PWD
Linux でグローバル環境変数を設定する
独自のグローバル環境変数を作成するには、それらを
/etc/environment
ファイルに追加します。このファイルを編集するには
sudo
を使用する必要があります。
sudo gedit /etc/環境
環境変数を追加するには、その名前、等号 (
=
)、および環境変数に保持したい値を入力します。等号 (
=
) の前後にスペースを入れないでください。環境変数の名前には、文字、アンダースコア (
_
)、または数字を含めることができます。ただし、名前の最初の文字を数字にすることはできません。
値にスペースが含まれている場合は、必ず値全体を引用符 (
"
) で囲んでください。
ファイルを保存し、ログアウトして再度ログインします。
echo
を使用して、新しい変数が存在し、設定した値を保持していることをテストします。
エコー $WEBSITE
これはグローバル環境変数であり、誰でも利用できるため、ユーザー
mary
次回ログインするときに環境変数を参照できます。
エコー $WEBSITE
すべての環境変数を一度に表示する
には、
printenv
と入力します。出力がたくさんあるので、それを
sort
にパイプしてから、
less
に渡すのが理にかなっています。
プリントエンブ |並べ替え |少ない
環境変数のソートされたリストは、
less
に表示されます。
grep
を介して出力をパイプして、
特定のトピックに関連する
環境変数を探すことができます。
プリントエンブ | grep GNOME
便利な Bash 環境変数
これらは、bash の動作と機能を指示または記録するために
bash
で使用されるシェル環境変数の一部です。一部の値は、端末を使用すると更新されます。たとえば、
COLUMNS
環境変数は、ターミナル ウィンドウの幅に加えた変更を反映するように更新されます。
-
BASHOPTS:
bash起動時に使用されたコマンドライン オプション。 -
BASH_VERSION:
単語と数字の文字列としての
bashバージョン番号。 -
BASH_VERSINFO:
数字で表した
bashバージョン。 - COLUMNS: ターミナル ウィンドウの現在の幅。
-
DIRSTACK:
pushdコマンドによって ディレクトリ スタックに追加され たディレクトリ。 -
HISTFILESIZE:
historyファイル に許可される最大行 数。 -
HISTSIZE:
メモリ内で許可される
historyの行数。 - HOSTNAME: コンピューターのホスト名。
- IFS: コマンドラインで入力を区切るために使用される 内部フィールド区切り記号 。デフォルトでは、これはスペースです。
-
PS1:
PS1環境変数には、プライマリ、デフォルト、およびコマンド プロンプトの定義が保持されます。エスケープ シーケンスと呼ばれる一連のトークンをコマンド プロンプトの定義に含めることができます。これらは、ホスト名、ユーザー名、現在の作業ディレクトリ、時刻などを表します。 -
PS2:
コマンドが複数行にまたがり、さらに多くの入力が予想される場合は、2 番目のコマンド プロンプトが表示されます。
PS2環境変数には、この 2 番目のプロンプトの定義が保持されます。デフォルトでは、大なり記号 (>) です。 -
SHELLOPTS:
setオプションを使用して設定できるシェル オプション。 - UID: 現在のユーザーの ユーザー識別子 。
これらのシェル変数のいくつかを確認してみましょう。
$BASH_VERSION をエコーする
$HOSTNAME をエコーする
エコー $COLUMNS
エコー $HISTFILESIZE
エコー $UID
完全を期すために、コマンド プロンプト定義で使用できるトークンを次に示します。
- \t: HH:MM:SS 形式の現在の時刻。
- \d: 現在の日付。曜日、月、日で表されます。
- \n: 改行文字。
- \s: シェルの名前。
- \W: 現在の作業ディレクトリの名前。
- \w: 現在の作業ディレクトリへのパス。
- \u: ログインしているユーザーのユーザー名。
- \h: コンピュータのホスト名。
-
\#:
シェル内の各コマンドには番号が付けられます。これにより、コマンド プロンプトでコマンドの番号を確認できるようになります。これは、コマンドの
historyリストに含まれる番号と同じではありません。 -
\$:
プロンプトの最後の文字を、通常のユーザーの場合はドル記号 (
$)、root ユーザーの場合はハッシュ記号 (#) に設定します。これは、ユーザーの UID をチェックすることで機能します。ゼロの場合、ユーザーは root です。
PS1
環境変数の定義は
.bashrc
ファイルにあります。
このセクションでは特に Bash について説明しますが、考え方は ZSH などの他のシェルでも同じです。ただし、シェル変数には違いがあります。
「 Linux 上の Bash で環境変数を設定する方法」に関するベスト動画選定!
Bash 環境変数を設定する
独自に使用する環境変数を作成するには、
.bashrc
ファイルの最後に環境変数を追加します。 SSH 接続などのリモート セッションで環境変数を使用できるようにしたい場合は、環境変数を
.bash_profile
ファイルにも追加する必要があります。
環境変数定義の形式は両方のファイルで同じです。
.bash_profile
ファイルに定義を追加するには、ホーム ディレクトリに次のように入力します。
gedit .bashrc
INHERITED_VAR
という環境変数を追加しました。行の先頭にある「export」という単語に注目してください。
編集が終了したら、ファイルを保存して閉じます。ログアウトして再度ログインすることも、次のようにドット コマンド (
.
) を使用してシェルに
.bash_profile
ファイルを再読み取りさせることもできます。
。 .bashrc
次に、コマンドラインで環境変数を作成しましょう。
LOCAL_VAR="このセッションのみ"
echo
使用すると、両方の環境変数にアクセスできることがわかります。
エコー $LOCAL_VAR
エコー $INHERITED_VAR
INHERITED_VAR
環境変数の定義の行頭に「export」という単語が含まれていることがわかります。これは、環境変数が現在のシェルの子プロセスに継承されることを意味します。
bash
コマンドを使用して別の変数を起動すると、子シェル内から 2 つの変数を再度確認できます。
バッシュ
エコー $LOCAL_VAR
エコー $INHERITED_VAR
ご覧のとおり、
INHERITED_VAR
は子シェルからアクセスできますが、
LOCAL_VAR
にはアクセスできません。単純に空行が表示されます。
「export」は子プロセスが引き継ぐ環境に環境変数部分を追加しますが、
INHERITED_VAR
グローバル環境変数ではありません。たとえば、ユーザー
mary
それを参照できません。
エコー $INHERITED_VAR
子
bash
セッションを閉じるには、
exit
使用します。
出口
継承された環境はスクリプトにも影響します。以下は、3 つの環境変数の値をターミナル ウィンドウに書き込む単純なスクリプトです。
#!/bin/bshecho "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
に対して実行してから、スクリプトを再度実行します。
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 dave@.local
接続したら、スクリプトをもう一度実行します。
./envtest.sh
.bash_profile
ファイルはリモート ログインの初期化の一部として読み取られており、
INHERITED_VAR
環境変数は私たちとスクリプトからアクセス可能です。
環境変数の設定を解除する
環境変数の設定を解除するには、
unset
コマンドを
使用します。グローバル環境変数
WEBSITE
とエクスポートされた環境変数
INHERITED_VAR
の設定を解除すると、それらはコマンド ラインでも子プロセスでも使用できなくなります。
ウェブサイトの設定を解除
INHERITED_VAR の設定を解除する
./envtest.sh
エコー $WEBSITE
注意すべき点は、これにより変更されるのは、このセッションでのグローバル環境変数の可用性のみであるということです。同時にログインしている別の人は、引き続きそのグローバル環境変数のインスタンスにアクセスできます。彼のインスタンスはログイン プロセス中に初期化され、
/etc/environment
ファイルから読み取られ、他のユーザーの変数のコピーから独立しています。
たとえば、ユーザー
dave
がセッションで
unset
た場合でも、ユーザー
mary
引き続き
WEBSITE
環境変数にアクセスしてその値を読み取ることができます。
エコー $WEBSITE
環境管理
環境変数を使用すると、スクリプトやアプリケーションにどのように動作すべきかを知らせることができます。設定や少量のデータを保存するために使用できます。たとえば、スクリプトは、ファイルに書き込むことなく他のスクリプトから参照できる値を環境に設定できます。





