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
jeśli~/.bash_profile
nie istnieje ...~/.profile
i~/.bashrc
od~/.bash_profile
Odpowiedzi:
Jeśli twój system ma
strace
, możesz wyświetlić listę plików otwartych przez powłokę, na przykład używając(
-li
oznacza interaktywną powłokę logowania; używaj tylko-i
do interaktywnej powłoki niezalogowanej).Spowoduje to wyświetlenie listy plików, które powłoka otworzyła lub próbowała otworzyć. W moim systemie są one następujące:
/etc/profile
/etc/profile.d/*
(różne skrypty w/etc/profile.d/
)/home/<username>/.bash_profile
(to się nie powiedzie, nie mam takiego pliku)/home/<username>/.bash_login
(to się nie powiedzie, nie mam takiego pliku)/home/<username>/.profile
/home/<username>/.bashrc
/home/<username>/.bash_history
(historia wierszy poleceń; to nie jest skrypt)/usr/share/bash-completion/bash_completion
/etc/bash_completion.d/*
(różne skrypty zapewniające funkcję autouzupełniania)/etc/inputrc
(definiuje przypisania klawiszy; to nie jest skrypt)Użyj,
man strace
aby uzyskać więcej informacji.źródło
echo $0
w terminalu daje-bash
raczej niż oczekiwanybash
. Czy masz na to jakieś sugestie?$0
to myślnik-
lub gdy jest wywoływany z opcją-l
.echo PATH=\""$PATH"\"
na początku i na końcu.profile
i.bashrc
? A dlaczego nie można zrobić to, co każdy robi i ustawić ścieżkę albo całkowicie, albo, jeśli dodanie katalogu, strzeżony:echo ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"
?sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"
na macOS. (wystarczy wymienićstrace
zdtruss
)