Po uruchomieniu terminala bash zauważyłem, że zmienna PATH zawiera zduplikowane wpisy. Mój terminal uruchamia powłokę logowania , więc ~/.bash_profile
jest pozyskiwany, a następnie ~/.profile
i ~/.bashrc
. Tylko ~/.profile
wewnątrz mogę utworzyć wpisy ścieżek, które są zduplikowane.
Aby być pedantycznym, jest to kolejność, w jakiej pozyskiwane są pliki, które POWINNY być pozyskiwane:
Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc
Zanim ktokolwiek oznaczy to jako duplikat „Zmienna PATH zawiera duplikaty”, czytaj dalej.
Na początku myślałem, że ma to związek z ~/.profile
dwukrotnym pozyskiwaniem, więc miałem plik zapisywać do pliku dziennika za każdym razem, gdy był pozyskiwany, i, co zaskakujące, zarejestrował tylko jeden wpis, co mówi mi, że został on pobrany tylko raz. Jeszcze bardziej zaskakujący jest fakt, że kiedy komentuję wpisy, które były ~/.profile
, wpisy wciąż pojawiają się w PATH
zmiennej. Doprowadziło mnie to do trzech wniosków, z których jeden został szybko wykluczony:
- Bash ignoruje prawidłowe komentarze basha i nadal wykonuje skomentowany kod
- Istnieje skrypt, który odczytuje
~/.profile
i ignoruje każdy kod, który drukuje dane wyjściowe (na przykład plik dziennika) - Jest moja kolejna kopia,
~/.profile
która jest pozyskiwana gdzie indziej
Po pierwsze, szybko doszedłem do wniosku, że tak nie jest ze względu na szybkie testy. Druga i trzecia opcja są tam, gdzie potrzebuję pomocy.
Jak zebrać dziennik skryptów, które są uruchamiane podczas uruchamiania mojego terminalu? Użyłem echo
w plikach, które sprawdziłem, aby wiedzieć, czy są one pozyskiwane przez bash, ale muszę znaleźć rozstrzygającą metodę, która śledzi wykonanie do momentu, gdy terminal jest gotowy, abym mógł zacząć pisać na nim.
Jeśli powyższe nie jest możliwe, każdy może zasugerować, gdzie indziej mogę sprawdzić, które skrypty są uruchamiane .
Przyszłe referencje
Oto skrypt, którego teraz używam do dodawania do mojej ścieżki:
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
}
Używam tego w ten sposób:
add_to_path 'PATH' "/some/path/bin"
Skrypt sprawdza, czy ścieżka już istnieje w zmiennej przed jej dodaniem.
W przypadku użytkowników Zsh możesz użyć tego odpowiednika:
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
}
Edytuj 28.08.2018
Kolejną rzeczą, którą mogłem zrobić z tym skryptem, jest także poprawienie ścieżki. Na początku .bashrc
pliku robię coś takiego:
_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
To od Ciebie PATH
należy zacząć. PATH
Najpierw sprawdź, aby podjąć decyzję.
~/.profile
i ~/.bashrc
od~/.bash_profile
~/.profile
jeśli~/.bash_profile
nie istnieje ...