Linux環境
LinuxShell ログインが成功すると、Linux はログイン用のファイルから一連のデータを取得し、このデータは個々の命令または個々のプログラムで使用されます。そのデータは LinuxShell ランタイム環境と呼ばれます。環境内のデータは、環境変数、シェル変数、エイリアス、シェル関数の 4 種類に大別できます。このうち、シェル変数、エイリアス、シェル関数については、ここでは詳しく説明しません。
環境変数とは何ですか?
パラメータを指定せずに printenv コマンドを直接使用して、現在のセッションの環境変数と環境変数の値を出力できます。パラメータを追加すると、特定の変数の値が出力されます。表示する方が便利な場合は、printenv の出力を less に渡して環境変数を表示できます (1):
printenv | 少ない
以下は、私の Linux システムでの出力の一部です:
... ... MANDATORY_PATH=/usr/share/gconf/cinnamon.mandatory.path XDG_SESSION_ID=c2 XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/rit ユーザー=リット DESKTOP_SESSION=シナモン QT4_IM_MODULE=fcitx GNOME_TERMINAL_SCREEN=/org/gnome/ターミナル/screen/e9e1def3_9380_43b6_8ce3_7916861e45d2 DEFAULTS_PATH=/usr/share/gconf/cinnamon.default.path QT_QPA_PLATFORMTHEME=qt5ct PWD=/ホーム/rit HOME=/ホーム/リット ... ...
ご覧のとおり、普段接触している PWD、HOME、USER などがすべてその中に含まれています。
コマンドのパラメータに変数の値を使用したい場合は、「$ 変数名」(2) と入力します。のような: ###
ls $HOME/bin
システムに付属する変数だけでなく、ユーザーは変数をカスタマイズすることもできます:
rit@rit-X405UA:~$ foo=FOO rit@rit-X405UA:~$ hello='Hello World' rit@rit-X405UA:~$ echo $foo FOO rit@rit-X405UA:~$ echo $hello こんにちは世界###
スペース、$ などの特殊文字が表示される場合は、コロン (3) で展開する必要があることに注意してください。
シェル内で実行されているプログラムが変数にアクセスできるようにするには、export コマンドを使用する必要があります。
rit@rit-X405UA:~$ エクスポート foo hello
このように現在のセッションで定義された変数は、現在のセッションでのみ有効です。つまり、ログアウトして再度ログインすると、変数は存在しません。シェルにログインするたびにこの変数を使用するには、環境変数構成ファイルで変数を定義する必要があります。
環境変数はどのファイルから取得されますか?
記事の冒頭で述べたように、Linux はファイルから環境変数を取得します。では、どのファイルが LinuxShell の環境変数を提供するのでしょうか? (ログインシェルと非ログインシェルについては前に説明します)
ログインシェルの場合:
/etc/profile, このファイルは、loginshell のグローバル環境変数設定ファイルです。グローバルとは、すべてのユーザーに対して有効であることを意味します。~/.bash_profile、~/.bash_login、~/.profile、これら 3 つのファイルが使用されます個人環境変数なので、各ユーザーの HOME ディレクトリにはこれら 3 つのファイルのうち少なくとも 1 つが含まれます (Linux ディストリビューションのバージョンによって異なります) linux はユーザー環境変数を変更します、読み取り時にのみ読み取りますいずれかのファイルを取得します。 loginshell がログインすると、Linux はまずグローバル設定ファイル Linux メモリ管理 /etc/profile を読み取り、次に HOME ディレクトリ内でこれら 3 つのファイルを特定の順序で検索し、最後に最初に見つかったファイルを読み取ります。 /etc/profile で定義された変数と競合がある場合、その変数は上書きされます。
非ログインシェルの場合:
/etc/bash.bashrc、このファイルは非ログインシェルのグローバル環境変数設定ファイルです。 (インターネット上の一部のブログの紹介では、このファイルは /etc/bash.bashrc ではなく、/etc/bashrc になっています。実際には、これはディストリビューションのバージョンによって異なります) ~/.bashrc、このファイルはユーザーの個人的な非ログインシェル環境変数設定ファイル。ログインシェルと同様、このファイルは /etc/bash.bashrc の後に実行されます。競合がある場合、このファイルは競合する変数も再描画します。
ファイルの読み取り順序に関する上記の説明は、この記事を参照しています。
さまざまな Linux ディストリビューションには su コマンドがあります。直接「su username」と入力すると、非ログインシェルとしてユーザーにログインします。オプション「-」または「-l」または「 --login」を追加すると、 "の場合、ユーザーはloginshellとしてログインします。読者がそのようなファイルの読み取りプロセスをより明確に理解している場合は、このコマンドを使用してそれらのファイルを変更してテストできます。
ログインシェルと非ログインシェル
LinuxShell にログインするには、ログインシェルと非ログインシェルの 2 つの方法があります。ログイン シェルは通常、最初のログイン シェル (たとえば、コンピュータの電源を入れたとき) として使用され、非ログイン シェルは通常、コンピュータの電源を入れた後に GUI から直接起動されるシェルです。これら 2 つの方法でログインするために使用される環境変数にはいくつかの違いがあります。
1.非ログインシェルは、前のプロセス (通常はログインシェル) からいくつかの環境変数を継承します。
簡単なテストで確認できます。まず、現在のシェルで変数 foo=FOO をカスタマイズし、エクスポートします (子プロセスでもこの変数を使用できるようにするため、シェル自体はプログラムです)。
rit@rit-X405UA:~$ foo=FOO rit@rit-X405UA:~$ エクスポート foo
rit@rit-X405UA:~$ su - ボブ パスワード: bob@rit-X405UA:~$ echo $foo bob@rit-X405UA:~$
次に、非ログインシェルを使用して別のアカウント bob にログインし、foo 変数を表示します。
rit@rit-X405UA:~$ スー ボブ パスワード: bob@rit-X405UA:/home/rit$ echo $foo FOO
非ログインシェルは前のプロセスのユーザー定義変数を継承しますが、ログインシェルは継承しないことを説明します。
2.PWD、ホーム、ユーザー、パス
1 の例でわかるように、ログインシェルの PWD は現在のユーザーの HOME ディレクトリ (~) に変更されますが、非ログインシェルは親プロセスの作業ディレクトリを継承します。
echo を使用して HOME と USER を表示すると、両方のログイン フォームでログインした後、これら 2 つの変数が現在のユーザーに対応するホーム ディレクトリとユーザー名に切り替わることがわかります。
PATH の 2 つのログイン形式の違いについては、~/.bash_profile (または ~/.bash_login、~/.profile) でいくつかの手掛かりを見つけることができます。上で述べたように、これら 3 つのファイルはloginshell で読み取られますが、~/.bashrc と注意深く比較すると、~/.bash_profie にさらに 2 行あることがわかります。
... PATH="$HOME/bin:$PATH" ... PATH="$HOME/.local/bin:$PATH" ...
非ログインシェル:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
ログインシェル:
/home/rit/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr /local/games:/snap/bin
注意深く見ると、他にも違いがあることがわかりますが、これらの違いの原因を見つけるのは簡単ではありません。
コメント
(1) Linux シェルにはパイプラインと呼ばれる機能があり、あるコマンドの出力を次のコマンドの入力にリダイレクトできます (つまり、特定のコマンドの入力が別のコマンドの入力と見なされます)。 ) ですが、前提条件として、命令が入力またはフォーム出力を受け入れることが必要です。一般的な命令には、cat、less、grep などが含まれます。入力と出力は「|」でつなぎます。
(2) linuxshell が $ 記号を読み取ると、まずその直前の文字を変数名として扱い、$ と変数名を変数の値に置き換えます。次に、置き換えられたパラメータが変数に渡されます。指示。これは、シェルの特性拡張におけるパラメータ拡張に属し、パラメータ拡張だけでなく、パス名拡張、中括弧拡張、およびコマンド置換も含まれます。
(3) は (2) の逆で、特殊な記号を無視したい場合は、右側にダッシュを追加できます。二重コロンは、「」、「`」、および「$」を除くすべての特殊記号をブロックします。単一のコロンはすべての特殊文字を無視します。
###参照する###環境変数ファイルを読み取る順序については、Web サイトのブログ
Linux ユーザー環境変数の変更を参照するだけでなく、その他の内容も書籍 TheLinuxCommandLine2ndEdititonAComplete Introduction から参照しています。 正誤表の校正 2019 年 7 月 4 日: (1) 変数をカスタマイズする場合、等号の左側と右側にスペースを残すことはできません。変更前は、等号の右側にスペースを入れてはいけないとだけ述べました。 (2) パラメータ展開により、「$変数名」が変数の値に置き換えられます。変更前の記述は「$変数名」を変数名に変換するものでした。 (3) エスケープ文字は展開特性に属しません。変更前は拡張に分類していました。新しいコンテンツ 2019 年 7 月 4 日: 「ユーザー定義変数」セクションの最後にカスタム変数のスコープの説明を追加しました。
以上がLinux 環境変数はどのファイルから取得されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。