diff --git a/profile.sh b/profile.sh index 786aed4..efd52c2 100644 --- a/profile.sh +++ b/profile.sh @@ -73,6 +73,29 @@ _profile_install_in_file() return 0 } +# Detect whether $rc_file sources the file whose basename is $target_name. +# Returns 0 (true) if a sourcing statement referencing $target_name is found, +# ignoring commented-out lines. +_profile_file_sources() +{ + local rc_file="$1" + local target_name="$2" + local line + + [[ -f "$rc_file" ]] || return 1 + + while IFS= read -r line || [[ -n "$line" ]]; do + # Strip comments so commented-out source lines are not matched. + line="${line%%#*}" + # Keep only lines whose first word is a source command (`source` or `.`). + [[ "$line" =~ ^[[:space:]]*(source|\.)[[:space:]] ]] || continue + # Match if the sourcing statement references the target file. + [[ "$line" == *"$target_name"* ]] && return 0 + done < "$rc_file" + + return 1 +} + _profile_install() { local install_bashrc=0 @@ -108,6 +131,19 @@ _profile_install() install_profile=1 fi + # Avoid double loading when both targets are selected and one already + # sources the other: only configure the called file so profile.sh is + # loaded exactly once. + if (( install_bashrc == 1 && install_profile == 1 )); then + if _profile_file_sources "$HOME/.bashrc" ".profile"; then + printf "[ Info ] ~/.bashrc sources ~/.profile; configuring only ~/.profile to avoid double loading.\n" + install_bashrc=0 + elif _profile_file_sources "$HOME/.profile" ".bashrc"; then + printf "[ Info ] ~/.profile sources ~/.bashrc; configuring only ~/.bashrc to avoid double loading.\n" + install_profile=0 + fi + fi + script_dir=$(dirname "$(realpath -s "${BASH_SOURCE[0]}")") source_line="source \"$script_dir/profile.sh\"" @@ -409,7 +445,7 @@ if [[ $INTERACTIVE ]]; then fi # Cleanup -unset -f _profile_is_sourced _profile_finish _profile_install_in_file _profile_install +unset -f _profile_is_sourced _profile_finish _profile_install_in_file _profile_file_sources _profile_install unset -f parse_conf load_alias load_conf unset -f pathremove pathprepend pathappend