Dlaczego mamy powłoki logowania, bez logowania, interaktywne i nieinteraktywne powłoki bash?

23

Strony podręcznika bash wyjaśniają, czym są powłoki logowania i interaktywne:

Powłoka logowania to taka, której pierwszym znakiem argumentu zero jest - lub rozpoczęty z opcją --login.

Powłoka interaktywna to taka, która została uruchomiona bez argumentów nie będących opcjami i bez opcji -c, której standardowe wejście i błąd są podłączone do terminali (jak określa isatty (3)), lub jedna została uruchomiona z opcją -i. PS1 jest ustawione, a $ - obejmuje i, jeśli bash jest interaktywny, pozwalając skryptowi powłoki lub plikowi startowemu przetestować ten stan.

Myślę, że to oznacza, że ​​możemy mieć 4 różne rodzaje pocisków:

  • Interaktywne powłoki logowania,
  • Nieinteraktywne powłoki logowania,
  • Interaktywne powłoki niezalogowane,
  • Nieinteraktywne powłoki niezalogowane

Ale dlaczego w ogóle mamy powłoki interaktywne / nieinteraktywne i powłoki do logowania / bez logowania? Dlaczego odmiana? Co byśmy stracili, gdybyśmy mieli tylko jeden rodzaj pocisku?

Również podczas próby ustalenia, czy działam w powłoce logowania echo $-, wyświetla:

himBH

Niektóre z tych flag wyjaśnione są tutaj , ale h, Hi mnie są wyjaśnione. Czy jest miejsce, które opisuje wszystkie te flagi?

TheFooProgrammer
źródło

Odpowiedzi:

21

Takie są moje przemyślenia na temat różnych „rodzajów” pocisków - niestety nie byłem świadkiem powstania Un * x od samego początku (zakładam, że ta koncepcja rozwinęła się historycznie w znacznym stopniu), więc proszę, bądźcie krytyczni.

  • Kiedy loguję się do systemu (obecnie za pomocą graficznego logowania X), mogą być zadania, które powinny zostać uruchomione raz, np. Nawiązanie połączenia z jakimś serwerem, przedstawienie mi dzisiejszej listy czynności do wykonania, automatyczne uruchomienie niektórych poleceń itp. To nie powinno się zdarzyć za każdym razem, gdy otwieram nowy terminal. Więc nie jest to zestaw plików konfiguracyjnych ( /etc/profile, ~/.bash_logini tak dalej, patrz podręcznik do dokładnej listy) pochodzą wyłącznie od logowania muszli.
  • W związku z tym, aby zamknąć połączenia, zabić niektóre programy, uruchomić skrypt kopii zapasowej, ~/.bash_logoutgdy istnieje powłoka logowania .
  • więc „normalna” powłoka, której używam w terminalu, nie powinna zawierać powłoki logowania , ale mimo to powinna czytać moje osobiste preferencje ~/.bashrc, ponieważ chcę, aby moje skróty klawiszowe oddziaływały z powłoką - stąd jest to interaktywna, powłoka logowania .
  • i na koniec, ale nie mniej ważne, gdy bash jest używany do pisania skryptów, żadne z tych elementów nie jest ważne. bashpowinien rozpocząć się tak szybko, jak to możliwe, tzn. nie powinien czytać żadnych plików konfiguracyjnych. Jest to nieinteraktywna powłoka niezalogowana .

Tak więc moja odpowiedź na twoje pytanie Co byśmy stracili, gdybyśmy mieli tylko jeden rodzaj pocisku? jest jednym słowem: „Elastyczność”.


Odpowiedź na twoje drugie pytanie jest łatwa:

$-wyświetla aktualny zestaw opcji. Można je ustawić za pomocą parametrów wiersza polecenia bashlub za pomocą setwbudowanego. Musisz więc spojrzeć na dwa miejsca w instrukcji:

  • OPTIONS Sekcja:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSsekcja, podsekcja set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
mpy
źródło
1
Woo wierzę, że @mpy odpowiedź na jasno sformułowane pytanie OP jest w stanie z powodzeniem opisać jakąś dość przydatną definicję. O tym: Więc powłoka niezalogowana jest tylko podzbiorem powłoki logowania, prawda?
tuk0z