Bashターミナルを開始した後、PATH変数に重複したエントリが含まれていることに気付きました。私の端末はログインシェルを開始するので、~/.bash_profile
がソースになり、その後に~/.profile
と~/.bashrc
が続きます。 ~/.profile
でのみ、重複するパスエントリを作成します。
わかりやすくするために、これはソースにする必要があるファイルがソースされる順序です。
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
これを「PATH変数に重複が含まれています」の重複としてマークする前に、読み続けてください。
最初は~/.profile
が2回ソースされることに関係していると思ったので、ファイルが読み込まれるたびにログファイルにファイルを書き込みました。 。さらに意外なのは、~/.profile
にあったエントリをコメントアウトしても、エントリがPATH
変数に表示されることです。これにより3つの結論が導き出されましたが、そのうちの1つはすぐに除外されました。
~/.profile
を読み取り、出力を出力するコード(ログファイルなど)を無視するスクリプトがあります。~/.profile
の別のコピーが別の場所で提供されています最初のものは、いくつかの簡単なテストのため、私はすぐにそうではないと結論しました。 2番目と3番目のオプションは、私がサポートを必要とするところです。
端末の起動時に実行されるスクリプトのログをどのように収集しますか?確認したファイルでecho
を使用して、bashがソースであるかどうかを確認しましたが、端末が入力を開始する準備ができた時点で実行を追跡する決定的なメソッドを見つけるため。
上記が不可能な場合は、実行されているスクリプトを確認するために他の場所を探すことができます。
これは、パスに追加するために今使用しているスクリプトです。
function add_to_path() {
for path in ${2//:/ }; do
if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
new_path="$path:${!1#:}"
export "$1"="${new_path%:}" # remove trailing :
fi
done
}
私はそれを次のように使用します:
add_to_path 'PATH' "/some/path/bin"
スクリプトは、パスを付加する前に、パスが変数にすでに存在するかどうかをチェックします。
Zshユーザーの場合、これと同等のものを使用できます。
function add_to_path() {
for p in ${(s.:.)2}; do
if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
new_path="$p:${(P)1#:}"
export "$1"="${new_path%:}"
fi
done
}
このスクリプトで私ができることがもう1つわかったことは、パスも修正することです。そのため、.bashrc
ファイルの先頭で、次のようにします。
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
PATH
の開始点はあなた次第です。最初にPATH
を調べて決定します。
システムにstrace
がある場合は、シェルを使用して開いたファイルを一覧表示できます。たとえば、
echo exit | strace bash -li |& grep '^open'
(-li
はインタラクティブなログインシェルを意味します。インタラクティブな非ログインシェルには-i
のみを使用してください。)
シェルが開いた、または開こうとしたファイルのリストが表示されます。私のシステムでは、次のとおりです。
/etc/profile
/etc/profile.d/*
(/etc/profile.d/
のさまざまなスクリプト)/home/<username>/.bash_profile
(これは失敗します。そのようなファイルはありません)/home/<username>/.bash_login
(これは失敗します。そのようなファイルはありません)/home/<username>/.profile
/home/<username>/.bashrc
/home/<username>/.bash_history
(コマンドラインの履歴。これはスクリプトではありません)/usr/share/bash-completion/bash_completion
/etc/bash_completion.d/*
(オートコンプリート機能を提供するさまざまなスクリプト)/etc/inputrc
(キーバインディングを定義します。これはスクリプトではありません)詳細については、man strace
を使用してください。