env -i bash を使用して Bash シェルを起動する場合、PATH 変数セットはどこにありますか?

env -i bash を使用して Bash シェルを起動する場合、PATH 変数セットはどこにありますか?

/etc/environment、、、など、複数の設定ファイルを読み込んだり実行したりして、環境変数が設定されることを知っています。/etc/profile~/.profile~/.bashrc

しかし、私が読んだときこのブログ投稿、環境をインポートせずにログインしていない対話型bashシェルを起動するには、次のコマンドを試しました。

 osboxes@osboxes:~$ env -i bash

PATH新しいシェルに入った後、変数を確認して次のような結果を得ました。

osboxes@osboxes:/home/osboxes$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

私が知る限り、この非ログインインタラクティブシェルはorを読み取ったりインポートしたりせず、合計/etc/environmentのみを提供します。/etc/profile~/.profile/etc/bash.bashrc~/.bashrc

PATHそれでは、このシェルセットの変数はどのように構成されていますか?読み取りまたはソースとして使用する特定のファイルはありますか?

答え1

printenvPATHに値がないことを確認してください。何かを見つけたら、おそらくあなたのものから来たのでしょう~/.bashrc。空の場合、Bash自体によって設定されます。シェルの起動時にPATH値が見つからない場合は、値を設定します。 PATHがなければ、ほとんど何も機能しないからです。

ソースコードでこれがどのように行われるかを確認できます(Bash 4.4のソースコードを見ています)。

存在するvariables.c:

  /* Now make our own defaults in case the vars that we think are
     important are missing. */
  temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);
#if 0
  set_auto_export (temp_var);   /* XXX */
#endif

存在するconfig-top.h表示された PATH と一致する定義を見つけることができます。

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
  "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif

.私はPATHを入れることが誤って仕事をするのは簡単なので、一般的に悪い習慣と見なされると思います!

答え2

PATHBourne Again シェルマニュアルに記載されているように、シェル変数を初期化する環境変数がなく、起動PATHスクリプトでシェル変数が設定されていない場合、シェル変数はデフォルト値を持ちます。

マニュアルによると、「インストールされたシステム管理者bash」によって値が異なります。実際、ソースからBourne Againシェルをコンパイルした人がどのオプションを選択したかによって異なります。

  • DebianのBourne Againシェルパッケージは、マニュアルの基本的な例に近いです。
    % unsetenv PATH `コマンド -v bash` -c 'echo $PATH printenv パス'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    %
  • Bourne AgainシェルのOpenBSDポート/パッケージは同じです。
    $unsetenv PATH `コマンド -v bash` -c 'echo $PATH printenv パス'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    $
  • Bourne AgainシェルのFreeBSDポート/パッケージでは多少破損しています。
    % unsetenv PATH `コマンド -v bash` -c 'echo $PATH printenv パス'
    /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin
    %
    2017年3月に、ソフトウェアの構築に使用されたコンパイラオプションを調整して調整しました。

printenvどの行も印刷されないという事実は、このデフォルトのシェルPATH変数が環境変数にエクスポートされないことを意味します。

関連情報