После запуска терминала bash я заметил, что переменная PATH содержит повторяющиеся записи. Мой терминал запускает оболочку входа в систему , поэтому ~/.bash_profileполучает источник, а затем ~/.profileи ~/.bashrc. Только в этом случае ~/.profileя создаю записи путей, которые дублируются.
Чтобы быть педантичным, это порядок, в котором файлы должны быть получены:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Прежде чем кто-либо пометит это как дубликат «переменная PATH содержит дубликаты», продолжайте чтение.
Сначала я подумал, что это связано с тем, ~/.profileчто он был получен дважды, поэтому я записывал файл в файл журнала всякий раз, когда он был получен, и, что удивительно, он регистрировал только одну запись, что говорит мне, что он был получен только один раз. Еще более удивительным является тот факт, что когда я закомментирую записи, которые были в ~/.profile, записи все еще появляются в PATHпеременной. Это привело меня к трем выводам, один из которых был быстро исключен:
- Bash игнорирует действительные комментарии bash и по-прежнему выполняет закомментированный код
- Существует скрипт, который читает
~/.profileи игнорирует любой код, который печатает вывод (например, файл журнала) - Есть еще одна копия моего,
~/.profileкоторая в других источниках
Первый, я быстро пришел к выводу, что это не так из-за быстрого тестирования. Во втором и третьем вариантах мне нужна помощь.
Как собрать журнал сценариев, которые выполняются при запуске моего терминала? Я использовал 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
}
Изменить 28/8/2018
Еще одна вещь, которую я нашел в этом сценарии, - это также исправить путь. Итак, в начале моего .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не существует ...