すべてのプロセスには、親プロセスから継承した名前と値の文字列集合である「環境」があります。シェルは環境変数を使い、言語設定や実行ファイルの検索パスなどを起動するプログラムへ渡します。
テキスト操作 · レッスン 5
env (環境)
Bash が環境変数を展開、エクスポート、確認し、一時的に上書きする方法を学びます。
Bash で変数の値を展開する
Bash はコマンドを実行する前に $NAME または ${NAME} を変数の値へ展開します。値を 1 つの引数として保つには展開を引用符で囲みます。
$ printf '%s\n' "$HOME"
/home/pete
よく使われる環境変数には次があります。
HOME:現在のユーザーのホームディレクトリ。USER:多くのシステムでログイン環境が設定するユーザー名。PWD:シェルの現在の作業ディレクトリ。PATH:コマンド名を検索するディレクトリ。
値は現在のプロセス環境によって異なり、普遍的な定数ではありません。未設定の変数は、より厳格なシェル動作を有効にしていなければ空文字列へ展開されます。
HOME の値を 1 つの引数として保ちながら表示する Bash コマンドはどれですか?
現在の環境を確認する
env を引数なしで実行すると、その env プロセスが継承した環境が表示されます。
$ env
出力には次のような NAME=value 形式のレコードが含まれます。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/bin
PWD=/home/user
USER=pete
環境変数には認証情報、トークン、内部パスなどの機密データが含まれることがあります。env の完全な出力を公開の課題やログへ貼る前に、必ず確認して機密部分を伏せてください。
新しく起動したプロセスから見える環境を表示するコマンドはどれですか?
PATH からコマンドを探す
PATH は、スラッシュを含まないコマンド名を Bash が検索するディレクトリをコロンで区切った一覧です。
$ printf '%s\n' "$PATH"
順序は重要で、Bash は名前解決規則に従って最初に見つけた適切なコマンドを使います。現在のシェルが名前をどう解決するかは type -a NAME で確認できます。
既存の検索パスを残し、現在のシェルと今後の子プロセス用に /opt/coolapp/bin を追加するには次のようにします。
$ export PATH="/opt/coolapp/bin:$PATH"
誤って PATH を新しいディレクトリだけで置き換えたり、信頼できない書き込み可能なディレクトリを追加したりしないでください。通常のコマンドが見つからなくなったり、意図しない実行ファイルが動いたりする恐れがあります。
現在の Bash と今後の子プロセスで、既存の PATH の前に /opt/coolapp/bin を追加するコマンドはどれですか?
変数を子プロセスへエクスポートする
Bash 変数は自動的には子プロセスの環境へ入りません。export で名前をエクスポート対象にします。
$ export TEST=test
$ printenv TEST
test
現在の Bash に TEST が作られ、起動するコマンドは TEST=test を継承します。子プロセスから親の環境を変更することはできません。通常、この代入は解除するかシェルを終了するまで続き、システム全体の環境は変更しません。
Bash で export TEST=test を実行する主な効果は何ですか?
1 つのコマンドだけに値を設定する
コマンドの前に代入を書くと、そのコマンドの環境だけへ値を渡せます。
$ LANG=C sort names.txt
$ env LANG=C sort names.txt
現在のシェルの LANG は恒久的には変わりません。env -i COMMAND は最初は空の環境でコマンドを起動しますが、多くのプログラムが環境値に依存するため意図的に使ってください。
現在のシェルの LANG を恒久的に変えず、sort names.txt を LANG=C で実行するコマンドはどれですか?
今後のセッションで個人用の値を読み込む
今後の対話型 Bash セッションで変数を再作成するには、そのセッションが実際に読む起動ファイル(対話型の非ログイン Bash では一般に ~/.bashrc)へ適切な export 行を書きます。
export TEST=test
Zsh は一般に ~/.zshrc を使い、Fish は異なる構文と設定を使います。ログインシェルや非対話型シェルは別のファイルを読むことがあるため、1 つのファイルですべてを設定できると思い込まず、シェルとセッションの種類を確認してください。
環境の継承とシェル設定を練習するには、次のラボを試してください。
- Linux でのシェル環境と設定の管理 - ローカル変数と環境変数、継承、
.bashrcによる永続化を練習します。 - Linux の環境変数 - 環境変数の概念、作成、変更、管理とシステム設定での役割を学びます。
レッスン完了
env (環境) を完了しました
Bash から子プロセスへ渡す環境を確認し、制御できるようになりました。
適切に引用符を使って変数の値を展開する。
機密情報を公開せず、エクスポート済みの値を確認する。
PATHのコマンドディレクトリを保持し、順序を管理する。今後の子プロセス用にシェル変数をエクスポートする。
親シェルを変えず、1 つのコマンドだけ値を上書きする。