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

35

Używam Linux Mint. Moja powłoka logowania ( cat /etc/passwd | grep myUserName) to bash.

Po uruchomieniu środowiska graficznego i uruchomieniu z niego emulatora terminali widzę, że .bash_profilenie jest on pozyskiwany (zmienne środowiska, które są exportw nim edytowane, nie są ustawione). Ale jeśli zaloguję się z konsoli tekstowej ( ctrl+ alt+ F1) lub ręcznie uruchomię bash -lz emulatora terminala, .bash_profiledziała dobrze.

Czy się mylę, gdy uważam, że .bash_profilenależy to uzyskać po exporturuchomieniu X, a wszystkie zmienne powinny być dostępne w terminalu, uruchamiając z X?

PS Umieszczanie wszystkiego .bashrci pozyskiwanie go .bash_profilenie jest dobrym pomysłem ( https://stackoverflow.com/questions/902946/ ): elementy środowiska powinny być pozyskiwane tylko raz.

AntonioK
źródło

Odpowiedzi:

39

Plik ~/.bash_profilejest odczytywany przez bash, gdy jest powłoką logowania. To dostajesz, gdy logujesz się w trybie tekstowym.

Kiedy logujesz się w X, skrypty startowe są wykonywane przez /bin/sh. Na Ubuntu i Mint /bin/shjest dash , a nie bash. Dash i bash mają te same podstawowe funkcje, ale myślnik trzyma się tych podstawowych funkcji, aby być szybkim i małym, podczas gdy bash dodaje wiele funkcji kosztem zapotrzebowania na więcej zasobów. Powszechnie używa się myślnika w skryptach, które nie wymagają dodatkowych funkcji, i bash w celu interaktywnego korzystania (chociaż zsh ma dużo ładniejszych funkcji ).

Większość kombinacje menedżera okien (program gdzie można wpisać nazwę użytkownika i hasło) oraz środowisko graficzne czytać ~/.profileze skryptów logowania w /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionlub w zależności od przypadku. Więc umieść definicje zmiennych środowiskowych w ~/.profile. Upewnij się, że używasz tylko składni obsługiwanej przez Dash.

Więc co powinieneś położyć?

  • Dobry .bash_profileładuje .profilei ładuje, .bashrcjeśli powłoka jest interaktywna.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • W .profile, wstaw definicje zmiennych środowiskowych i inne ustawienia sesji, takie jak ulimit.

  • W .bashrcumieścić bash interaktywne ustawienia takie jak aliasy, funkcje, zakończenia, kluczowych powiązań (które nie są .inputrc), ...

Zobacz także Różnica między powłoką logowania a powłoką niezalogowaną? i Alternatywa dla .bashrc .

Gilles „SO- przestań być zły”
źródło
1
wiele rzeczy nauczyłem się z jednej odpowiedzi :)
Mt
16

.bash_profileto skrypt konfiguracji uruchamiania bash. Nie ma standardowego upoważnienia X do źródła .bash_profile.

To, o czym myślisz, to raczej .profile. Pierwotnie był to plik konfiguracyjny uruchamiania powłoki Bourne'a (sh). Obecnie w wielu dystrybucjach środowisko pulpitu jest skonfigurowane jako źródło .profile. Pamiętaj, że nie jest to również standard, ale wydaje się, że jest to konwencja.

Debian korzystał ze źródła .profilepodczas logowania graficznego ( strona wiki od 2013 r. ), Ale teraz nie robi tego ( strona wiki od 2016 r .).

Archuj źródła .xprofileprzy graficznym logowaniu ( strona wiki z 2013 r .).

Ubuntu odradzało używanie .profile( strona wiki od 2013 r. ), Teraz już nie zniechęca ( strona wiki od 2016 r .).


Jeśli chodzi o twoje inne pytanie: Dlaczego mój ~ / .bash_profile nie działa? Takie jest oczekiwane zachowanie.

Krótko mówiąc, zachowanie jest następujące:

  • bash zaczął jako interaktywna powłoka logowania: czyta ~/.profile
  • bash zaczął jako interaktywna powłoka niezalogowana: czyta ~/.bashrc

Aby uzyskać więcej informacji, zobacz moją odpowiedź na podobne pytanie w askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319 # 132319

lesmana
źródło
1
Niektóre z nich są poprawne, ale „zawsze czytaj ~/.bashrc” to zła rada: powinieneś czytać tylko .bashrcz interaktywnej powłoki . Pominąłeś tutaj podstawowy problem polegający na tym, że podczas logowania w X nie ma instancji logowania bash (w większości kombinacji menedżera wyświetlania / środowiska graficznego, w tym oczywiście AntonioK).
Gilles „SO- przestań być zły”,
Dziękujemy za twoją opinię. Mam nadzieję, że zaktualizowałem odpowiedź wystarczająco dobrze, aby rozwiązać twoje skargi. Jeśli chodzi o moją radę, by „zawsze czytać .bashrc”, zawsze miałem na myśli interaktywną powłokę. Wyjaśniłem tę część. Mam nadzieję, że to już nie wprowadza w błąd.
lesmana
2
Ubuntu specjalnie odradza używanie .profile( link ) ” Wiki raz (absurdalnie) to odradzała; to zostało naprawione. (Uwaga /etc/profilenie jest zalecana w przypadku przypisań systemowych, zamiast dodawania skryptów /etc/profile.d.) .profilePliki dla poszczególnych użytkowników są teraz przedstawiane jako jeden z zalecanych sposobów ustawiania zmiennych środowiskowych dla poszczególnych użytkowników: „Odpowiednie pliki dla ustawień zmiennych środowiskowych, które powinny mieć wpływ tylko na określonym użytkownikiem (a nie całym systemem) są ~ / .pam_environment i ~ / .profile . "
Eliah Kagan
Połączona strona o Debianie określa, że ​​Debian nie czyta danych ~/.profilelogowania graficznego i ~/.xsessionrcpowinien zostać użyty.
karora
dzięki za zauważenie. strona wiki została zaktualizowana. Połączyłem się z wersjami takimi, jakie były w momencie odpowiedzi.
lesmana
2

W swoim pytaniu odwołujesz się do https://stackoverflow.com/questions/902946/ jako zalecanie, aby nie pobierać źródła, gdy zaakceptowana 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 [EDYTOWANO: snip code-comments]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

Wrzucenie tego wszystkiego .profilenie działało dla mnie w Linux Mint. Korzystanie .bashrcdziałało dobrze.

serv-inc
źródło
2

Podczas próby przeładowania / source ~ / .profile powstaje kilka problemów. [Dotyczy to Linuksa Ubuntu - w niektórych przypadkach szczegóły poleceń będą inne]

  1. Czy uruchamiasz to bezpośrednio w terminalu lub w skrypcie?
  2. Jak uruchomić to w skrypcie?

Ogłoszenie. 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 o zawartość pliku .profile.

Ad 2) Możesz uruchomić dowolny skrypt bash, dzwoniąc

sh myscript.sh 

lub

. myscript.sh

W pierwszym przypadku spowoduje to utworzenie podpowłoki, która nie wpłynie na zmienne środowiskowe twojego systemu i będą widoczne tylko dla procesu podpowłoki. Po zakończeniu polecenia podpowłoki nie zostanie zastosowany żaden eksport itp. TO JEST WSPÓLNY BŁĄD I POWODUJE DUŻO DEWELOPERÓW, KTÓRE STRACĄ DUŻO CZASU.

Aby zmiany zastosowane w skrypcie miały wpływ na środowisko globalne, skrypt musi zostać uruchomiony

.myscript.sh

dowództwo.

Aby upewnić się, że skrypt nie jest uruchamiany w subszelach, 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 rozwiąże to niektóre z powszechnych nieporozumień! : D Powodzenia!

twboc
źródło
0

Prostym rozwiązaniem jest uczynienie terminala terminalem logowania. W przypadku terminala Gnome w obszarze „Kafelek i polecenie” profilu domyślnego można zaznaczyć pole „Uruchom polecenie jako powłokę logowania”. W tym artykule wyjaśniono różnicę między powłoką logowania a powłoką, która nie jest.

driftingprogrammer
źródło