Dlaczego nie ' t mój ~ / .bash_profile nie działa?

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 jak ulimit.

  • 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]

  1. Czy uruchamiasz to bezpośrednio w terminalu czy w skrypcie?
  2. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *