目次
なぜ Linux には環境変数が必要なのでしょうか?
Linux がコマンドを実行するとき、対応する実行可能プログラムを検索するために多くのディレクトリに移動します。実行可能プログラムが異なるディレクトリに分散している場合、検索に非常に時間がかかります。そのため、Linux はコマンドを実行するときに、指定されたファイルに移動して、実行可能プログラムが配置されているディレクトリを見つけます。この指定されたファイルが環境変数設定ファイルです。
Wildfire の原文: Linux はマルチユーザーおよびマルチタスク システムであるため、各ユーザーには異なるシステム オペレーティング環境が必要です。異なる Linux ユーザーに対して異なる環境変数を設定することによってのみ、異なるユーザーのニーズを満たすことができます。
環境変数は実際にはシェル変数の一種です
グローバル変数と環境変数
直接定義
gec@ubuntu:~$ abc=123
gec@ubuntu:~$ echo abc
abc
gec@ubuntu:~$ echo $abc
123
gec@ubuntu:~$ /bin/bash
gec@ubuntu:~$ echo $abc
gec@ubuntu:~$ exit
exit
gec@ubuntu:~$ echo $abc
123
gec@ubuntu:~$ export abc
gec@ubuntu:~$ /bin/bash
gec@ubuntu:~$ echo $abc
123
輸出
export
コマンドは変数をエクスポート (または環境変数として設定) できるため、子プロセスはその変数を監視および使用できます。
シェル でコマンドを使用して変数をエクスポートするとexport
、その変数は現在のシェル プロセスの環境に追加され、シェル プロセスとそのすべての子プロセスで表示されます。これは、現在のシェルによって開始された子プロセスはすべて、この環境変数にアクセスして使用できることを意味します。
たとえば、変数がシェルで定義され、次のコマンドMY_VAR
でexport
エクスポートされたとします。
$ MY_VAR="Hello, world" $ export MY_VAR
次に、新しいサブプロセスを開始して、スクリプトを実行します。
$ ./myscript.sh
このスクリプトでは、この環境変数は子プロセスにエクスポートされているため、myscript.sh
直接アクセスして使用できます。MY_VAR
子プロセスが親プロセスから継承した環境変数の値を変更しても、親プロセスや同じレベルの他の子プロセスの環境変数の値には影響しないことに注意してください。各プロセスには独自の環境変数のコピーがあり、あるプロセスで環境変数を変更しても他のプロセスには影響しません。
そのため、コマンドを利用することでexport
親プロセスと子プロセス間で変数の受け渡しや情報の共有を容易に行うことができ、プロセス間のデータ交換や通信を実現できます。
シェル設定ファイル
実際、シェル プロセスが開始されるたびに、シェル構成ファイル内のコードが実行され、初期化作業が行われます。
Bash Shell に関連する設定ファイルには主に次のものがあります。
-
/etc/プロファイル
-
~/.bash_profile
-
~/.bash_login
-
~/.profile
-
~/.bashrc
-
/etc/bashrc
-
/etc/bash.bashrc
-
/etc/profile.d/*.sh
これらの構成ファイルは、Bash シェルでの実行時間が異なります。
-
/etc/profile
: これはシステムのグローバル構成ファイルであり、システムの起動時に実行され、すべてのユーザーの環境変数を設定し、システムレベルの初期化タスクを実行します。 -
~/.bash_profile
、~/.bash_login
、~/.profile
: これらはユーザーの個人設定ファイルであり、ユーザーのログイン時に実行されます。これらはBashによって優先順位に従って検索され実行されますが、通常はそのうちの1つを選択して設定することができ、優先順位は上から下に向かって徐々に低くなります。 -
~/.bashrc
: これはユーザーの個人設定ファイルであり、新しい Bash ターミナル ウィンドウが開かれるたびに実行されます。ユーザー固有の環境変数、エイリアス、カスタム関数などを設定するために使用されます。 -
/etc/bashrc
、/etc/bash.bashrc
: これらはシステム レベルの Bash 構成ファイルで、新しい Bash ターミナル ウィンドウが開かれるたびに実行され、システム レベルの環境変数を設定し、すべてのユーザーに対してその他の初期化タスクを実行します。 -
/etc/profile.d/*.sh
.sh
: これは、で終わるいくつかのシェル スクリプト ファイルを含むディレクトリです。これらのスクリプト ファイルは、ユーザーがログインすると自動的に実行され、特定のアプリケーションまたはライブラリの環境変数と構成情報をロードするために使用できます。
/etc/profile
グローバル設定ファイル ( やなど/etc/profile.d/*.sh
) は通常、すべてのユーザーに対して有効ですが、ユーザーの個人設定ファイル ( や~/.bash_profile
など~/.bashrc
) は現在ログインしているユーザーに対してのみ有効であることに注意してください。
実行時のシーケンスは次のとおりです。
- ログインすると、グローバル設定ファイルが最初に実行されます
/etc/profile
。 - 次に、優先順位(通常は、または(最初に存在するもののみ))に従ってユーザーの個人プロファイルを選択して実行します。ここでのグローバル変数は特定のユーザーに対してのみ有効です
~/.bash_profile
~/.bash_login
~/.profile
- 新しい Bash ターミナル ウィンドウを開くと、ユーザー プロファイルが存在する
~/.bashrc
場合はそれが実行されます。 - 同時に、新しい Bash ターミナル ウィンドウが開かれるたびに、システム レベルの構成ファイル
/etc/bashrc
とスクリプトも実行されます/etc/bash.bashrc
。ここのグローバル変数はすべてのユーザーに有効です
実際、これはルート ディレクトリ / とホーム ディレクトリの違いです。
これらの構成ファイルを編集およびカスタマイズすることで、システム レベルおよび個人レベルの構成を実装し、環境変数、エイリアス、関数などをカスタマイズし、他のカスタム シェル スクリプトを読み込むことができます。
シェルの実行順序
/etc/profiles->~/.profile(~/.bash_profile、~/.bash_login)
sudo vi /etc/profile
sudo vi ~/.profile
設定ファイルを変更する
すべてのユーザーとすべてのプロセスによって共有されます: /etc/bash.bashrc
gec@ubuntu:~$ sudo vi /etc/bash.bashrc
1 人のユーザー、すべてのプロセスで共有: ~/.bashrc シェル起動モードは変数に影響を与える
gec@ubuntu:~$ sudo vi .bashrc
サブシェル プロセスで実行します: /bin/bash および ./
現在のプロセス (source および ) で実行します。
xiaoming@ubuntu:/home/gec$ sudo vi test2.sh
[sudo] xiaoming 的密码:
xiaoming@ubuntu:/home/gec$ sudo chmod 777 test2.sh
xiaoming@ubuntu:/home/gec$ ./test2.sh
xiaoming@ubuntu:/home/gec$ su gec
密码:
gec@ubuntu:~$ source test2.sh
gec@ubuntu:~$ echo $a
111
gec@ubuntu:~$ echo $b
222
gec@ubuntu:~$ unset a b
gec@ubuntu:~$ echo $a
gec@ubuntu:~$ echo $b
gec@ubuntu:~$ . test2.sh
gec@ubuntu:~$ echo $a
111
gec@ubuntu:~$ echo $b
222
gec@ubuntu:~$ unset a b
gec@ubuntu:~$ /bin/bash test2.sh
gec@ubuntu:~$ echo $a
gec@ubuntu:~$ echo $b