免責事項:bashを使用してください。
次の事項について理解するための確認/修正が必要です。
env
デフォルトでは、現在のセッションとすべての子セッション(たとえば、子セッションに入る場合)bash
にアクセスできる現在の環境変数が表示されます。新しい変数を設定すると、その変数を
MYMESSAGE="hello world!"
作成したセッションにのみ表示されます。たとえば、サブセッションに入ると進むことはできませんecho $MYMESSAGE
。export MYMESSAGE="hello world!"
サブセッションからアクセスできるようにすることができます。export
ドラッグはすべての項目に追加するのと同じです。env
しかし、
export
何をしたとしてもセッションを閉じてターミナルを再起動しても持続しません。ログイン時にスクリプトが実行されますので、.bashrc
ディレクトリを編集して新しい環境変数を追加してください。/home/username/
これまで私の理解は正しいですか?
env
また、詳細はどこから来るのか完全には理解していません。環境変数のリストがすべて一部のファイルに保存され、編集/追加されますか.bashrc
?私はこれがどのように機能するのか理解したいと思います。
答え1
あなたは基本的に正しいが、いくつかの追加があります...
bashは複数の「スタートアップファイル」を実行できます。いくつかはbourne-shell(sh)との以前のバージョンとの互換性のためであり、他のものはbashの起動方法によって異なります。 Xにログインしましたか? TTYにログインしましたか?bash
別の(bash-)シェルから始めますか? Bashはスクリプト(非対話型)で実行されますか?したがって、.bashrcはそうではありません。いつも実行することも、唯一の起動ファイルでもありません。しかし、他の起動ファイルでも.bashrcを「インポートして」(読み込んで実行)することをお勧めしますので、.bashrcの内容は常に追加されます。 bashの起動方法のセクションを使用しman bash
てみてください...FILESセクションには、すべての起動ファイルを含むbashで使用されるファイルも一覧表示されます。より深く理解するために試してみてくださいinfo bash
。
独自の起動ファイルに加えて、/ etcに対応する「デフォルト」グローバル起動ファイルがあります。これらのファイルは通常、独自のbash
起動ファイルの前に読み込まれ、実行されます。 Bashで定義された環境変数に加えて、独自の環境変数を定義する別のプログラムがあります。これは、Bashで設定した環境変数を補完または上書きすることもできます。特に注目すべき点はX(GUI)です。どちらも設定するからです。その他XがVTで手動で起動されるかどうかに応じて、環境設定(xinit
または使用)のユーザー名/パスワードを入力するためのダイアログボックスが表示されます。startx
xdm
kdm
ただし、他のプログラムが起動する前やbash
使用X
されるほとんどの環境(環境変数)は、たとえばコマンドによって設定されますlogin
。これらのほとんどは/etc/login.defsやその他の設定ファイルにあります。たとえば、PATH 変数が設定され、root か一般ユーザーかによって異なります。
したがって、起動、初期化、およびログインプロセスの一部として実行されるさまざまなファイルとスクリプトを調べると、リストされているほとんどの変数が利用可能であることがわかりますenv
。ただし、一部(たとえば、CWD
現在の作業ディレクトリ)は、シェル自体によって自動的に設定(および更新)されます。
コマンドを実行すると、bashはfork()というシステムコールを使用します。 bash
子プロセスが新しいPID(プロセスID)を取得し、そのPPID(親PID)が「母親」のPPID(親PID)であることを除いて、デフォルトではそれ自体が同じコピーを作成します。それ以外の場合、環境変数も同じです。問題の変数がexport
最初のingに継承可能であるとします。これで2つのコピーがありますbash
。次に、基本的には、子bashプロセスの「メモリにある」bashプログラムを別のプログラムに置き換える別のシステムコールであるexec()を使用しますls
。変数はまだ存在するため、新しいプログラムは環境を継承します。この子は、端末が終了するまで端末を制御します(&を使用してバックグラウンドでコマンドを入力しない限り)。元のbash-shellは(デフォルトでは)スリープモードのままです。コマンドが終了したら、元の-shellに戻り、別のコマンドを実行する準備が整います。ps
mutt
bash
bash
答え2
環境はファイルではなく新しく作成されたプロセスのスタックを介して渡されますが、これを達成する方法はシステムコールexec()
に環境を渡すことです。
env
は外部コマンド(シェル組み込みとは逆)なので、シェルのenv
変数のみが印刷されます。exported
set
反対側にはすべてのシェル変数がリストされます。それらのいくつかは輸出されます。export
シェルからエクスポートされたシェル変数を一覧表示します。
ところで:
.bashrc
ログインシェルではなく、すべての対話型(bash)シェルで実行されます。他のシェルには、この機能の異なる名前があります。 Bourne Shellでksh
使用されます。.kshrc
.shrc
.profile
ログインシェルとして実行します。このファイルは、すべての Bourne Shell 互換シェルで共有されます。
答え3
あなたの理解は正しいです。
/home/username/.bashrc は /etc/bash.bashrc の設定を追加または上書きします。
/etc/profileにもいくつかの関連設定があり、/home/username/.profileを持つことができますが、これは主に歴史的互換性の理由で存在します。 (Bashの基盤となるBourneシェルの製品です。)