Після запуску 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.08.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
його немає ...