.bashrc、env、およびエクスポートを理解してください。

.bashrc、env、およびエクスポートを理解してください。

免責事項:bashを使用してください。

次の事項について理解するための確認/修正が必要です。

  1. envデフォルトでは、現在のセッションとすべての子セッション(たとえば、子セッションに入る場合)bashにアクセスできる現在の環境変数が表示されます。

  2. 新しい変数を設定すると、その変数をMYMESSAGE="hello world!"作成したセッションにのみ表示されます。たとえば、サブセッションに入ると進むことはできませんecho $MYMESSAGE

  3. export MYMESSAGE="hello world!"サブセッションからアクセスできるようにすることができます。exportドラッグはすべての項目に追加するのと同じです。env

  4. しかし、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または使用)のユーザー名/パスワードを入力するためのダイアログボックスが表示されます。startxxdmkdm

ただし、他のプログラムが起動する前や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に戻り、別のコマンドを実行する準備が整います。psmuttbashbash

おすすめ記事