Bash Manual mówi:
Bash próbuje ustalić, kiedy jest uruchamiany ze standardowym wejściem podłączonym do połączenia sieciowego, tak jak w przypadku wykonania przez zdalny demon powłoki, zwykle rshd lub bezpieczny demon powłoki sshd. Jeśli Bash ustali, że jest uruchamiany w ten sposób, odczytuje i wykonuje polecenia z ~ / .bashrc, jeśli ten plik istnieje i można go odczytać.
Źródła tego Bash ~/.bashrc
:
ssh user@host :
Ale źródła Bash ~/.bash_profile
:
ssh user@host
Nie widzę różnicy w tych dwóch poleceniach zgodnie ze specyfikacją. Czy stdin nie jest podłączony do połączenia sieciowego w obu przypadkach?
Odpowiedzi:
Powłoka logowania najpierw czyta,
/etc/profile
a następnie~/.bash_profile
.Powłoka niezalogowana odczytuje
/etc/bash.bashrc
odtąd~/.bashrc
.Dlaczego to takie ważne?
Z powodu tej linii w
man ssh
:Innymi słowy, jeśli polecenie ssh ma tylko opcje (nie polecenie), na przykład:
Rozpocznie się powłoka logowania, czytana jest powłoka logowania
~/.bash_profile
.Polecenie ssh, które ma takie polecenie , jak:
Gdzie jest polecenie
:
(lub nic nie rób).To będzie nie uruchomi powłokę logowania, więc
~/.bashrc
to, co będzie czytać.Zdalne wejście
Dostarczone połączenie tty dla / dev / stdin w komputerze zdalnym może być rzeczywistym tty lub czymś innym.
Dla:
Który kończy się na TTY (nie połączenie sieciowe), gdy widzi to uruchomiona bash.
W przypadku połączenia ssh z poleceniem:
Lista TTY zaczyna się tak samo, ale pamiętaj, że nie podano źródła / etc / profile.
Co mówi powłoce, że połączenie jest potokiem (a nie połączeniem sieciowym).
Tak więc w obu przypadkach testowych powłoka nie może wiedzieć, że połączenie pochodzi z sieci i dlatego nie czyta
~/.bashrc
(jeśli mówimy tylko o połączeniu z siecią). Czyta ~ / .bashrc, ale z innego powodu.źródło
~/.bashrc
odczytany?stdin
połączenie z siecią . Dlaczego tak myślisz? (Odpowiedź zredagowana, proszę przeczytać).Pytasz o „dlaczego”, a nie „jak”, więc postaram się odpowiedzieć z tej perspektywy. Poniżej przedstawione zostaną uzasadnione przyczyny, dla których w przeszłości wydarzyły się rzeczy, które doprowadziły do tego, jak się dzisiaj dzieje.
Powodem posiadania dwóch różnych plików startowych („profil” i „rc”) jest to, że w przeszłości powszechnym sposobem pracy na komputerze było:
Zaloguj się z jakiegoś prawdziwego terminala lub innej stacji roboczej i uzyskaj powłokę logowania . Ta powłoka będzie powoływać
/etc/profile
i~/.profile
i konfiguracja środowiska dla użytkownika.Wywołaj środowisko, do którego użytkownik chce wejść. Środowiskiem tym może być Xorg, ale w większości przypadków był to multiplekser, taki jak ekran GNU.
Środowisko (np. Ekran GNU) wywoływałoby wówczas dodatkowe powłoki (niezalogowane), które dziedziczą środowisko po nadrzędnej powłoce logowania.
To była powszechnym sposobem logowania do systemu UNIX w czasie, gdy
csh
ibash
były rozwijane. Dlatego uznano za niepotrzebne~/.profile
ponowne czytanie w powłokach, które i tak dziedziczyły środowisko.bash
następnie dodano w~/.bashrc
celu dodatkowej konfiguracji dla tych powłok, które nie są zalogowane.csh
(itcsh
) nigdy nie dodał żadnego pliku „rc” dla powłok nie zalogowanych. Zauważ, żecsh
/tcsh
nie są powłokami kompatybilnymi z powłoką Bourne'a (która jest częścią POSIX), podczas gdybash
jest. Kolejna powłoka kompatybilna z Bourneksh
, dodała zmienną środowiskową (wywoływanąENV
), która, jeśli została zdefiniowana, byłaby używana jako plik komend uruchamiania („rc”) dla braku logowaniaksh
.Więc tak, nowsze wersje powłok Bourne dodały dodatkowy plik konfiguracyjny jako wygodę dla aliasów i innych szybkich opcji, które byłyby obecne w powłokach zmiksowanych przez ekran GNU (lub podobny), ale nieobecne w powłoce, którą dostajesz, gdy po raz pierwszy wchodzisz do maszyna.
Wraz z pojawieniem się graficznych menedżerów wyświetlania (GDM) rozróżnienie między plikami „profilowymi” i plikami „rc” stało się bez znaczenia, ponieważ GDM miałby własne pliki inicjujące (np.
~/.xinit
I~/.xsession
). Następnie powłoki podane z GDM mogą być powłokami do logowania lub bez logowania, w zależności od zachcianek użytkownika, a przypadek, w którym powłoka bez logowania zawsze miałaby rodzica, który jest powłoką do logowania, nie jest już prawdą.Dodatkowy
Jedna z moich ulubionych tabel na temat porównania plików startowych powłoki pokazuje, w jaki sposób powłoki zgodne z powłoką Bourne'a używają
profile
plików, podczas gdy inne powłoki tego nie robią. Jest tak, ponieważ w przeszłości początkowa powłoka (ta, która uruchomiła multiplekser) musiała być powłoką kompatybilną z Bourne'em.źródło