После запуска терминала 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
если~/.bash_profile
не существует ...~/.profile
и~/.bashrc
от~/.bash_profile
Ответы:
Если ваша система имеет,
strace
вы можете перечислить файлы, открытые оболочкой, например, с помощью(
-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
для получения дополнительной информации.источник
echo $0
в терминале дает-bash
скорее, чем ожидалосьbash
. У вас есть другие предложения по этому поводу?$0
является тире-
или когда вызывается с опцией-l
.echo PATH=\""$PATH"\"
в начале и в конце.profile
и.bashrc
? И почему вы не делаете то, что делают все, и не устанавливаете PATH полностью, или, если добавляете каталог, защищеныecho ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"
:?sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"
на macOS. (просто заменитьstrace
наdtruss
)