少し前にセットアップしたLinuxインスタンスがあります。起動してroot
としてログインすると、設定した環境変数がいくつかありますが、それらがどこから来たのか思い出せない、またはどこから来たのかわかりません。
~/.bash_profile
、/etc/.bash_rc
、およびすべての起動スクリプト。find
とgrep
を実行しても無駄に終わりました。当たり前のところを探すのを忘れているような気がします。これを理解するためのトリックはありますか?
env
コマンドを使用して変数を表示する場合、変数は作成された順序で大まかに表示されます。これは、ブートの非常に早い段階でシステムによって設定されたか、それ以降の.profileまたは他の構成ファイルによって設定されたかのガイドとして使用できます。私の経験では、set
コマンドとexport
コマンドは変数をアルファベット順に並べ替えるので、リストはそれほど役に立ちません。
zsh
がログインシェルの場合:
zsh -xl
bash
の場合:
PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
これにより、ログインシェルがシミュレートされ、実行されたすべての内容(stderrがzsh
でリダイレクトされる領域を除く)と現在解釈されているファイルの名前が表示されます。
したがって、必要なのは、その出力で環境変数の名前を探すことだけです。 (script
コマンドを使用して、シェルセッションの出力全体を保存することができます。または、bash
アプローチの場合、7> file.log
の代わりに7>&2
を使用して、xtrace
出力は、ターミナルではなくfile.log
に出力されます)。
変数がそこにない場合、おそらくシェルは起動時にそれを継承したため、PAM構成、~/.ssh/environment
、またはX11セッションの起動時に読み取られるもの(~/.xinitrc
、~/.xsession
)または、ログインマネージャーを起動したサービス定義に設定するか、ブートスクリプトでそれより前に設定します。次に、find /etc -type f -exec grep -F THE_VAR {} +
が役立ちます。
最初に見るべき場所:
システム全体
/etc/environment
:環境変数専用/etc/env.d/*
:環境変数、複数のファイルに分割/etc/profile
:すべてのタイプの初期化スクリプト/etc/profile.d/*
:初期化スクリプト/etc/bashrc
、/etc/bash.bashrc
:関数とエイリアス用ユーザー固有
~/.bash_profile
:ログイン(bash-)シェルの初期化~/.bashrc
:すべてのインタラクティブ(bash-)シェルの初期化~/.profile
:すべてのシェルに使用されます~/.cshrc
、~/.zshrc
、~/.tcshrc
:非bashシェルでも同様@Cianは正しいです。 find
とgrep
を使用する以外に、それがどこから来たのかを見つけるためにできることはあまりありません。それが実際に環境変数であることを知っているので、私は/ etc /とホームディレクトリに検索の焦点を当てようとします。 VARIABLE
を検索する適切な変数に置き換えます。
$ grep -r VARIABLE /etc/*
$ grep -r VARIABLE ~/.*
set -x
を.profile
または.bash_profile
に入れると、後続のすべてのシェルコマンドが標準エラーに記録され、そのうちの1つがこれらの変数を設定しているかどうかを確認できます。 set -x
を/etc/profile
の先頭に配置して、トレースすることもできます。出力は非常に冗長になる可能性があるため、exec 2>/tmp/profile.log
などのファイルにリダイレクトすることをお勧めします。
システムがPAMを使用している場合は、pam_env
または/etc/pam.conf
で/etc/pam.d/*
ロード要求を探します。このモジュールは、指定されたファイルから、またはファイルが指定されていない場合はシステムデフォルトから環境変数をロードします(DebianおよびUbuntuでは/etc/environment
および/etc/security/pam_env.conf
)。 Linuxでの環境変数定義を含む別のファイルは/etc/login.defs
です(ENV_
で始まる行を探してください)。
スタートアップスクリプトで、.
(ドット)またはsource
を使用して、ソースがtheyであるファイルを確認します。これらのファイルは、/etc
および$HOME
以外のディレクトリにある可能性があります。
zsh
ユーザーの場合、(起動時に)アクセスされるファイルをトレースすると便利です。ファイルが多すぎず、1つずつ調べて、何かが定義されている場所を見つけることができます。
zsh -o SOURCE_TRACE
環境変数は/ etc/profileファイルに格納されるため、さらに/ etc/profileを実行して、必要な環境変数を確認します。/etc/profileが存在しない場合は、ホームディレクトリの.profileファイルを探します。