web-dev-qa-db-ja.com

/ etc / zshenvの前に設定されたPATH

UbuntuのPATH変数に/opt/texbinフォルダーを追加するファイルを見つけようとしています。 /etc/environmentファイルに存在しません。 Sudo grep -lr texbin . 2>/dev/nullは、/etcフォルダーに何も出力しません。それでも、set -xファイルの先頭に/etc/zshenvを追加すると、zshがこのファイルをソースする前に/opt/texbinがPATHにあることがわかります。

何か案は?

5
sencer

このアプローチを試して、PATH変数の/opt/texbinのソースを追跡します。

  1. 実際には読み込まれているファイルのリストを取得するには(たとえば、非標準ファイルは別のファイルから供給されている可能性があります!)、_ [SOMECODE]を指定してzshを呼び出すことができます。 _有効なオプション:

    SOURCE_TRACE
  2. PATH変数が機能する次のファイルを確認してください。

    $ zsh -o sourcetrace
    +/etc/zshenv:1> <sourcetrace>
    +/home/user/.zshrc:1> <sourcetrace>
    +/home/user/.zcompdump:1> <sourcetrace>
    +/home/user/.zshrc-last:1> <sourcetrace>
    

    zshは配列$ grep -ie "path.*=" files_from_step_1 を使用するため、大文字と小文字を区別しないことが重要です。配列$pathは、bashのようなコロンで区切られたリスト$PATHに自動的に変換され、その逆も同様です。

  3. それでも運が悪い場合は、/etc/zshenvにデバッグメッセージを含めてみてください。コマンドは次の場所から最初に読み取られます。

    print -l $path
    

    これにより、zshが親プロセス(ディスプレイマネージャー、initプロセスなど)から継承するPATH変数の適切なリストが表示されます。*

  4. パスが実際に開始プロセスから継承されている場合は、どのプロセスが関連しているかを知ることが重要です。

    $ pstree -apH $$
    

    これにより、シェルプロセス($$のpid)が強調表示されたプロセスツリーが生成されます。これらのプロセスの構成ファイルも確認し、次の点に注意してください。

    • source /some/fileまたは. /some fileもPATHを変更できます
    • あなたが編集する場合、例えば現在のコンソールで/etc/profile、ログオフして再度ログインすると、親プロセス(Xログオンマネージャー)の環境が古い可能性があります。+

* あなたが書いたように、PATHには/opt/texbinが読み取られる前にすでに/etc/zshenvが含まれており、set -x/etc/zshenvによってチェックされます。この手法では出力が得られませんが、ステップ3では、他のステップも回答に含めました。

+しばらく前にこの行動のためにひどく苦しんだ...

4
mpy

/etc/zshenvがロードされたときに実行トレースまたはソーストレースをアクティブ化する正しい方法は、シェルコマンドでアクティブ化することです:zsh -l -o xtracezsh -l -o sourcetrace-パス要素はログイン時にのみ追加される可能性があるため、必ず-lオプションを試してください。

これに加えて、/etc/zshenvがロードされる前にまだパス要素が追加されている場合は、~/.pam_environmentファイルを確認できます。これは/etc/environmentファイルのユーザーローカルバージョンであり、シェルまたはユーザー環境の前にほぼ同時にロードされます。使用される形式の詳細については、manページ「pam_env」を確認してください。ユーザーファイルによって異なります。

もう1つの小さな可能性は、ENV環境変数です。 SH互換シェルがSH互換モードで起動されると、パスがENVにあるファイルが、何よりも先にスタートアップファイルとしてロードされます。詳細については、シェルのドキュメントを検索してください。 login.defsは、ログイン時やさまざまなユーザー/ログインユーティリティでも使用されますが、/etc/environmentはすべての最新のログインシステムの標準であり、PATH変数の確立に適しています。

1
Micah

ログイン時にシェルに渡されるPATH変数は、/etc/login.defsで定義されます。ここには、ENV_SUPATHENV_PATHの2つの設定があります。 rootとしてログインするかユーザーとしてログインするかに応じて、2つのうちの1つが環境変数PATHを介してシェルに渡されます。 PATH変数がシェルに渡された後、追加の変更はシェルの起動スクリプトによって制御されます。

1
Friartek