После запуска терминала 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
не существует ...