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


154

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

  • 私がチェックした~/.bash_profile/etc/.bash_rcと、すべての起動スクリプト。
  • 私が実行したfindgrep無駄に。

明らかな場所を見るのを忘れているに違いないと思う。これを理解するためのトリックはありますか?


6
/etc/environment別のものです。
デロバート

8
そして/etc/env.d/*ファイル。しかし、grep -R "YOUR_VARIABLE" /etc/おそらくそれを行うことが最善の方法です。
rozcietrzewiacz


@rozcietrzewiacz最も簡単な方法...変数が実際に/ etc /の下にある場合(私の場合のように)。あなたは答えとして、それを投稿した場合、私はupvoteだろう;)
ライン

回答:


55

envコマンドを使用して変数を表示する場合、変数は作成された順におおよそ表示されます。これは、ブートの非常に早い段階でシステムによって設定された場合、または後の.profileまたは他の構成ファイルによって設定された場合のガイドとして使用できます。私の経験では、setand exportコマンドは変数をアルファベット順にソートするので、リストはそれほど有用ではありません。


1
環境変数(/ etc / environmentで設定)をクリアしているものを見つけようとしているのを除けば、それは素晴らしいことです。:-)(はい、最初に設定されています...さまざまなスクリプトに行を追加して、クリアされる場所をログに記録しています...)
マイケルシェパー

128

zshログインシェルの場合:

zsh -xl

bash

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

これはログインシェルをシミュレートし、zsh現在解釈されているファイルの名前とともに、行われたすべて(stderrがリダイレクトされる領域を除く)を表示します。

そのため、出力で環境変数の名前を探すだけです。(scriptコマンドを使用してシェルセッション出力全体を保存するのに役立ちます。または、bashアプローチのために、7> file.log代わりに7>&2を使用して、端末ではなくxtrace出力を保存しますfile.log)。

変数がそこにない場合、おそらくシェルは起動時にそれを継承したので、PAM設定、in ~/.ssh/environment、またはX11セッションの起動時に読み取られるもの(~/.xinitrc~/.xsession)、またはログインを開始したサービス定義に設定される前に設定されましたマネージャまたはブートスクリプトの初期段階です。その後、find /etc -type f -exec grep -F THE_VAR {} +助けになるかもしれません。


4
印象的で役立つ、ありがとう。n00bsについては、モードについてもう少し説明してください。モードから抜け出す方法を教えてください。たとえば、この出力を単にgrepでパイプすることはできません。
ジェフリーヘイル

5
@GeoffreyHaleもしzsh -xl 2>&1、つまり、stderrとstdoutの出力をマージすれば、いつものようにgrepできます。
ラケシュ

1
fishシェルでこれを行う方法はありますか?
ニックスウィー

を使用してもzsh -xl 2>&1、どういうわけか正常にgrepできません。どうやら、出力には適切な改行などが含まれていないようです。
ゼロス

を使用してPS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen)、そのランダムファイルでgrepを使用することもできると思います。
bd1251252

51

最初に見るべきいくつかの場所:

システム全体

  • /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のシェルの同様の

31

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

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
「できます」という答えに囲まれた「できない」という答えに、これほど多くの賛成票があることは驚くべきことです。
マイケルシェパー

変数が設定された場所を実際に判断する方法を提供する答えは見当たりません。いくつかの有用な手がかりがありますが、仕事をすることができるワンライナーはありません。
アンドリューワーグナー

このことが私の時間を解決しました。ありがとう
ハッサンラザ

@MichaelScheperは、find / grepなしでは「できません」。以降で「あなたはできる」grepを使用してそれを行う方法を説明しています
ラインを

23

あなたが入れた場合はset -x、あなたの中.profile.bash_profile、それ以降のすべてのシェルコマンドは、標準エラー出力に記録され、そのうちの一つは、これらの変数を設定した場合、あなたは見ることができます。あなたは置くことができるset -xの上部にある/etc/profileとしても、それをトレースします。出力は非常に冗長になる可能性があるため、次のようなファイルにリダイレクトすることをお勧めしますexec 2>/tmp/profile.log

システムがPAMを使用している場合pam_env/etc/pam.confまたはでロード要求を探します/etc/pam.d/*。指定したファイルからこのモジュールをロード環境変数は、システムのデフォルトのファイルを指定しない場合は(/etc/environment/etc/security/pam_env.confDebianとUbuntuの上)。Linuxでの環境変数定義を含む別のファイルは/etc/login.defs(で始まる行を探しますENV_)です。


5

ファイルのためのあなたの起動スクリプトを確認し、彼らはソース使用.(ドット)またはsource。これらのファイルは、/etcおよび以外のディレクトリにある可能性があり$HOMEます。


2

以下のためzshのユーザー、(起動時に)アクセスされたファイルを追跡することは役立つことができ、彼らはあまりにも多くのものではなく、一つは何かが定義された場所を見つけるために、1つずつに目を通すことができます。

zsh -o SOURCE_TRACE

0

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


1
環境変数はに保存されません。ログインシェルとして使用する場合など、/etc/profileシステム全体で環境変数を定義できますbash。ファイルやコマンドラインから定義を読み込んだ後、シェルプロセスによって保存されます。
アントン

-2

たとえば、HISTFILE変数とその値を検索する場合、またはどの変数が履歴に関して定義されているかを知りたい場合は、シェルにこれを入力します。

set | grep HIST
env | grep HIST
printenv | grep HIST

すでに名前を知っていれば、なぜありませんか:echo "$HISTFILE"
ジェフシャラー

なぜなら、$ HISTFILE変数が定義されている場所を見つけたいからです。また、私は歴史アボ定義された変数を知ることwnat場合
バサル・アリイバ

2
残念ながら、set変数を定義したファイルはわかりません。
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.