web-dev-qa-db-ja.com

環境変数がどこから来たかを判断する方法は?

少し前にセットアップしたLinuxインスタンスがあります。起動してrootとしてログインすると、設定した環境変数がいくつかありますが、それらがどこから来たのか思い出せない、またはどこから来たのかわかりません。

  • 確認しました~/.bash_profile/etc/.bash_rc、およびすべての起動スクリプト。
  • findgrepを実行しても無駄に終わりました。

当たり前のところを探すのを忘れているような気がします。これを理解するためのトリックはありますか?

177
Joel

envコマンドを使用して変数を表示する場合、変数は作成された順序で大まかに表示されます。これは、ブートの非常に早い段階でシステムによって設定されたか、それ以降の.profileまたは他の構成ファイルによって設定されたかのガイドとして使用できます。私の経験では、setコマンドとexportコマンドは変数をアルファベット順に並べ替えるので、リストはそれほど役に立ちません。

63
Ben Combee

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 {} +が役立ちます。

158

最初に見るべき場所:

システム全体

  • /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シェルでも同様
65
beetstra

@Cianは正しいです。 findgrepを使用する以外に、それがどこから来たのかを見つけるためにできることはあまりありません。それが実際に環境変数であることを知っているので、私は/ etc /とホームディレクトリに検索の焦点を当てようとします。 VARIABLEを検索する適切な変数に置き換えます。

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

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
4
Erik Zivkovic

環境変数は/ etc/profileファイルに格納されるため、さらに/ etc/profileを実行して、必要な環境変数を確認します。/etc/profileが存在しない場合は、ホームディレクトリの.profileファイルを探します。

0
Sarvesh Pawar