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つだけ記録され、1回だけインポートされたと言いました。さらに驚くべきことは、項目をコメントアウトしても、その項目がまだ変数~/.profile
に表示されることです。PATH
これにより、私は3つの結論に達しましたが、そのうちの1つはすぐに排除されました。
- Bashは有効なbashコメントを無視し、コメントアウトされたコードを実行し続けます。
~/.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ユーザーの場合は、同じ方法を使用できます。
# prepends the given path(s) to the supplied PATH variable
# ex. add_to_path 'PATH' "$(go env GOPATH)/bin"
function add_to_path() {
# (P)1 path is expanded from $1
# ##: Removes leading :
local -x pth="${(P)1##:}"
# (s.:.) splits the given variable at :
for p in ${(s.:.)2}; do
# %%/ Remove trailing /
# :P Behaves similar to realpath(3)
local p="${${p%%/}:P}"
if [[ ! "$pth" =~ "$p" ]]; then
pth="$p:$pth"
fi
done
export "$1"="${pth%%:}"
}
2018年8月28日修正
このスクリプトでできることのもう1つは、パスの修正でした。だから私のファイルの先頭で.bashrc
次のようにしました。
_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path
PATH
何から始めるべきかによって異なります。決定する前に確認PATH
してください。
ベストアンサー1
システムにいる場合は、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
については。