Używam Linux Mint. Moja powłoka logowania (cat /etc/passwd | grep myUserName
) to bash.
Po uruchomieniu graficznego środowiska graficznego i uruchomieniu z niego emulatora terminala widzę, że .bash_profile
nie jest źródłem (zmienne środowiskowe, które są export
ed są nieustawione) .Jeśli jednak zaloguję się z konsoli tekstowej ( ctrl + alt + F1 ) lub uruchomię ręcznie bash -l
z emulatora terminala, .bash_profile
działa dobrze.
Czy się mylę, gdy myślę, że .bash_profile
powinno być pobierane, gdy X uruchamia się, a wszystkie export
„ed vars powinny być dostępne w terminalu, uruchamiane z X?
PS Umieszczenie wszystkiego w .bashrc
i pozyskiwanie z .bash_profile
to zły pomysł ( https://stackoverflow.com/questions/902946/ ): informacje dotyczące środowiska należy pozyskiwać tylko raz.
Odpowiedź
Plik ~/.bash_profile
jest odczytywany przez bash, gdy jest powłoką logowania. To właśnie otrzymujesz, logując się w trybie tekstowym.
Kiedy logujesz się pod X, skrypty startowe są wykonywane przez /bin/sh
. W systemie Ubuntu i Mięta, /bin/sh
to myślnik , a nie bash. Dash i bash mają te same podstawowe funkcje, ale kreska pozostaje te podstawowe funkcje, aby były szybkie i małe, podczas gdy bash dodaje wiele funkcji kosztem większych zasobów. Często używa się myślnika dla skryptów, które nie potrzebują dodatkowych funkcji i bash do użytku interaktywnego (chociaż zsh ma wiele ładniejszych funkcji ).
Większość kombinacji wyświetlania manager (program, w którym wpisujesz swoją nazwę użytkownika i hasło) i środowisko pulpitu przeczytaj ~/.profile
ze skryptów logowania w /etc/X11/Xsession
, /usr/bin/lightdm-session
, /etc/gdm/Xsession
lub cokolwiek ma zastosowanie. Więc umieść definicje zmiennych środowiskowych w ~/.profile
. Upewnij się, że używasz tylko składni obsługiwanej przez myślnik.
Więc co należy umieścić gdzie?
-
Dobry
.bash_profile
ładuje.profile
i ładuje.bashrc
, jeśli powłoka jest interaktywna.. ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi
-
W
.profile
umieść definicje zmiennych środowiskowych i inne ustawienia sesji, takie jakulimit
. - W
.bashrc
umieść interaktywne ustawienia basha, takie jak aliasy, funkcje, uzupełnianie, przypisania klawiszy (których nie ma w.inputrc
),…
Zobacz także Różnica między powłoką logowania a powłoką bez logowania? i Alternatywa dla .bashrc .
Komentarze
- Wiele rzeczy, których nauczyliśmy się z jednej odpowiedzi: )
- nawet .profile nie ' nie działa w Debianie 10 ” Buster „, tylko .bashrc wor ks
Odpowiedź
.bash_profile
to skrypt konfiguracji startowej grzmotnąć. Nie ma standardowego upoważnienia X do pobierania źródła .bash_profile
.
Myślisz raczej o .profile
. Pierwotnie był to plik konfiguracji startowej powłoki Bournea (sh). Obecnie wiele dystrybucji ma skonfigurowane środowisko graficzne na źródło .profile
. Zauważ, że to również nie jest standard, ale wydaje się, że jest to konwencja.
Debian używał źródła .profile
podczas logowania graficznego ( strona wiki od 2013 r. ), teraz nie” t ( strona wiki od 2016 r. ).
Źródła archiwów .xprofile
przy logowaniu graficznym ( strona wiki od 2013 r. ).
Ubuntu odradzał używanie .profile
( strony wiki od 2013 r. ), teraz już nie odradza ( stronę wiki z 2016 r. ).
A propos Twojego drugiego pytania: dlaczego nie działa mój ~ / .bash_profile? oczekiwane zachowanie.
Krótko mówiąc, zachowanie jest następujące:
- bash został uruchomiony jako interaktywna powłoka logowania: czyta
~/.profile
- bash został uruchomiony jako interaktywna powłoka bez logowania: czyta
~/.bashrc
Aby uzyskać więcej informacji, zobacz moją odpowiedź na podobny ar pytanie w askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319
Komentarze
- Część z nich jest poprawna, ale„ zawsze czytaj
~/.bashrc
”to zła rada: powinieneś czytać tylko.bashrc
z interaktywnej powłoki .' przegapiłeś podstawowy problem, który polega na tym, że podczas logowania pod X nie ma instancji logowania bash (w większości kombinacji menedżera wyświetlania / środowiska graficznego, w tym najwyraźniej AntonioK ' s). - Dziękujemy za Twoją opinię. Mam nadzieję, że zaktualizowałem moją odpowiedź na tyle dobrze, aby rozwiązać Twoje skargi. Jeśli chodzi o moją radę dotyczącą „, zawsze czytaj
.bashrc
„, zawsze miałem na myśli interaktywną powłokę . Wyjaśniłem tę część. Mam nadzieję, że już nie wprowadza w błąd. - ” Ubuntu szczególnie odradza używanie
.profile
( link ) ” Wiki kiedyś (absurdalnie) to zniechęciło; że ' zostały naprawione. (Uwaga/etc/profile
nie jest zalecana do przydziałów w całym systemie, zamiast dodawać skrypty do/etc/profile.d
.) Na użytkownika są teraz przedstawiane jako jeden z zalecanych sposobów ustawiania zmiennych środowiskowych dla poszczególnych użytkowników: ” Pliki odpowiednie dla ustawień zmiennych środowiskowych, które powinny mieć wpływ tylko na konkretnego użytkownika ( zamiast całego systemu) to ~ / .pam_environment i ~ / .profile . ” - Podlinkowana strona o Debianie określa, że Debian nie czyta
~/.profile
w przypadku logowania graficznego i~/.xsessionrc
powinno używany zamiast tego. - dziękuję za uwagę. strona wiki została zaktualizowana. połączyłem się z wersjami, jakie były w momencie udzielenia odpowiedzi.
Odpowiedź
Kilka problemów pojawia się, gdy próba ponownego załadowania pliku / source ~ / .profile. [Dotyczy to Ubuntu Linux – w niektórych przypadkach szczegóły poleceń będą inne]
- Czy uruchamiasz to bezpośrednio w terminalu czy w skrypcie?
- Jak to zrobić uruchomisz to w skrypcie?
Reklama. 1)
Uruchomienie tego bezpośrednio w terminalu oznacza, że nie zostanie utworzona podpowłoka. Możesz więc użyć dwóch poleceń:
source ~/.bash_profile
lub
. ~/.bash_profile
W obu przypadkach spowoduje to zaktualizowanie środowiska zawartością pliku .profile.
Reklama 2) Możesz uruchomić dowolny skrypt basha, wywołując
sh myscript.sh
lub
. myscript.sh
W pierwszym przypadku spowoduje to utworzenie podpowłoki, która nie wpłynie na zmienne środowiskowe Twój system i będą widoczne tylko dla procesu podpowłoki. Po zakończeniu polecenia podpowłoki żaden z eksportów itp. Nie zostanie zastosowany. JEST TO WSPÓLNY BŁĄD I POWODUJE, ŻE DUŻO PROGRAMISTÓW TRACI DUŻO CZASU.
Aby zmiany zastosowane w skrypcie odniosły skutek środowisko globalne skrypt musi zostać uruchomiony z poleceniem
.myscript.sh
.
Aby upewnić się, że skrypt nie jest uruchamiany w podpółkę możesz użyć tej funkcji. (Ponownie przykład dotyczy powłoki Ubuntu)
#/bin/bash preventSubshell(){ if [[ $_ != $0 ]] then echo "Script is being sourced" else echo "Script is a subshell - please run the script by invoking . script.sh command"; exit 1; fi }
Mam nadzieję, że to wyjaśnia niektóre z typowych nieporozumień! : D Powodzenia!
Odpowiedź
W swoim pytaniu odwołujesz się do https://stackoverflow.com/questions/902946/ jako odradzanie źródła, gdy akceptowana odpowiedź nakazuje
- Umieść moją konfigurację PATH w pliku .profile (ponieważ czasami używam innych powłok)
- Umieść moje aliasy i funkcje Bash w pliku. bashrc
Następnie użyj tego [EDITED: snip code-comments]:
.bash_profile
:#!/bin/bash # echo "Loading ${HOME}/.bash_profile" source ~/.profile # Get the paths source ~/.bashrc # get aliases
Wszystko w .profile
zrobił nie działa dla mnie na Linux Mint. Używanie .bashrc
działało dobrze.
Odpowiedź
Najprostszym rozwiązaniem jest ustawienie terminal terminal logowania. W przypadku terminala Gnome w „Kafelek i komenda” profilu domyślnego można zaznaczyć pole „Uruchom polecenie jako powłoka logowania”. Ten artykuł wyjaśnia różnicę między powłoką logowania a powłoką, która nie jest.