Których plików instalacyjnych należy używać do konfigurowania zmiennych środowiskowych za pomocą bash?

9

Tak jak pytałem i otrzymałem odpowiedzi tutaj , a tutaj , zmienna PATH ma różne nazwy ścieżek w zależności od sposobu aktywacji aplikacji.

  • Których plików instalacyjnych (.bashrc, .profile, ...) należy użyć, aby mieć tę samą zmienną PATH bez względu na to, jak uruchomić oprogramowanie w bash?
prosseek
źródło

Odpowiedzi:

15

Tradycyjnie miejscem definiowania zmiennych środowiskowych dla poszczególnych użytkowników w systemach uniksowych jest ~/.profile. Ten plik jest odczytywany przez powłokę logowania (tj. Program uruchamiany podczas logowania i do którego można wpisywać polecenia), pod warunkiem, że powłoka logowania jest powłoką kompatybilną z Bourne.

Bash jest powłoką kompatybilną z Bourne. Gdy jest wywoływany, gdy powłoka logowania odczytuje, ~/.bash_profileczy ten plik istnieje, a ~/.profilejeśli ~/.bash_profilenie istnieje.

Zasadniczo, jeśli wpiszesz hasło w trybie tekstowym (np. Na konsoli tekstowej lub zdalnie za pomocą ssh), wówczas otrzymana powłoka jest powłoką logowania.

Jeśli jednak wpiszesz hasło w programie graficznym i zalogujesz się w środowisku graficznym, ominie to normalną powłokę logowania. To, czy .profilezostanie odczytane w tym przypadku, zależy od konfiguracji sesji graficznej; na przykład różni się między dystrybucjami Linuksa, menedżerami wyświetlania i środowiskami pulpitu. Czasami jeden z programów w łańcuchu jawnie wywołuje powłokę logowania; czasami jeden z programów wyraźnie czyta ~/.profile; a czasem nic z tego się ~/.profilenie dzieje i nie można go odczytać.

Podam przykład zmienności, o ile mogę stwierdzić po szybkim spojrzeniu na zaangażowane skrypty, na Ubuntu 10.04: jeśli logujesz się za pomocą kdm lub lxdm, ~/.bash_profileczyta się, jeśli istnieje, i ~/.profileinaczej; jeśli zalogujesz się za pomocą gdm, tylko ~/.profileczytane; jeśli zalogujesz się za pomocą xdm, ~/.profilenie zostanie odczytany.

Wszystkie znane mi systemy zapewniają pewien sposób ustawiania zmiennych środowiskowych dla poszczególnych użytkowników. Niestety nie ma ogólnej odpowiedzi.

Zauważ, że czasami zobaczysz zalecenia, aby albo ustawić zmienne środowiskowe ~/.bashrc, albo uruchomić powłokę logowania na każdym terminalu w środowisku GUI. Oba są złymi pomysłami; jednym z powodów jest występujący problem, a mianowicie to, że zmienne środowiskowe były dostępne tylko w programach uruchamianych za pomocą terminala, a nie w programach uruchamianych bezpośrednio za pomocą ikony lub menu lub skrótu klawiaturowego.

Gilles „SO- przestań być zły”
źródło
Niektóre aplikacje wywołują interaktywne powłoki niezalogowane, co oznacza, że ​​.profile i .bash_profile nie są odczytywane. Jeśli chcesz ustawić zmienne env dla tych aplikacji, jednym ze sposobów jest ustawienie ich w .bashrc, nawet jeśli nie jest to odpowiednie miejsce; patrz github.com/mobile-shell/mosh/issues/102#issuecomment-12503646
William
@William .profilejest odczytywany po zalogowaniu. Wprowadzanie zmiennych środowiskowych .bashrcnie działa, a twój scenariusz pokazuje, że: aplikacja (prawdopodobnie GUI), która uruchamia tę powłokę, powinna mieć twoje zmienne środowiskowe, ale jeśli je zdefiniujesz .bashrc, to nie będzie t.
Gilles 'SO - przestań być zły'
mosh nie jest GUI, jest alternatywą dla ssh. Nie bronię jego zachowania, staram się tylko pomóc innym, którzy napotykają ten sam problem, który miałem i inni, jak opisano w powiązanym z Githubem problemem.
William
2

Ostateczna odpowiedź znajduje się w sekcji strony podręcznika bash w Bash Startup Files . „Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, Bash odczytuje i wykonuje polecenia z ~ / .bashrc, jeśli plik istnieje.”

Odpowiedzi na inne pytania wskazują, że eshell nie działa bash. Emacs eshellnie jest bash. Zakładanie, eshellże ładowanie byłoby .bashrctak samo błędne, jak zakładanie zshlub cshładowanie .bashrc. To inna skorupa.

Widzę dwie opcje:

  1. Stwórz własny skrypt, który pobiera listę katalogów i generuje odpowiedni kod bash dla bashi elisp eshell.
  2. Ustaw zmienną środowiskową ESHELL lub SHELL, tak aby faktycznie uruchamiać bash w emacsie. To jest to co robię. Bash działa dobrze w emacs.

Być może zainteresuje Cię dyskusja na temat dodawania katalogu do ścieżki bez duplikatów .

Doug Harris
źródło
1

Ustawienie PATH w pliku ~ / .profile powinno po prostu działać. Plik ten jest odczytywany przy logowaniu przez każdą powłokę zgodną z POSIX lub podobną do Bourne'a, o której wiem, w tym bash. Jeśli wprowadzisz zmiany w tym pliku, będziesz musiał się wylogować i zalogować ponownie, aby zmiany odniosły skutek. Ponieważ PATH jest częścią środowiska twojego procesu logowania, należy go wyeksportować do każdej powłoki, którą uruchomisz później.

garyjohn
źródło