bashターミナルを起動した後、PATH変数に重複したエントリが含まれていることに気付きました。私の端末が起動ログインシェルは、そう~/.bash_profile
、調達が続いている~/.profile
と~/.bashrc
。~/.profile
重複するパスエントリを作成するのは、その中だけです。
教訓的であるために、これは、ソースされるべきであるファイルがソースされるべき順序です:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
誰かがこれを「PATH変数に重複が含まれている」とマークする前に、読み続けてください。
最初は~/.profile
、これは2回ソースされていることと関係があると考えたため、ソースされるたびにログファイルにファイルを書き込むようにしましたが、驚くべきことに、1つのエントリのみがログに記録されました。さらに驚くべきことは、にあったエントリをコメントアウト~/.profile
すると、PATH
変数にまだエントリが表示されるという事実です。これにより、3つの結論に至りましたが、そのうちの1つはすぐに除外されました。
- bashは有効なbashコメントを無視し、引き続きコメント付きコードを実行します
~/.profile
出力を出力するコード(たとえばログファイル)を読み取り、無視するスクリプトがあります- 別の
~/.profile
場所から調達されている私の別のコピーがあります
最初の1つは、いくつかの迅速なテストのため、そうではないとすぐに結論付けました。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
}
2018年8月28日編集
このスクリプトでできることは、パスを修正することです。だから私の.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
最初に調べて決定します。
~/.profile
と~/.bashrc
から~/.bash_profile
~/.profile
場合~/.bash_profile
は存在しません ...