Perché abbiamo shell bash login, non login, interattive e non interattive?


23

Quindi le pagine man di bash spiegano quali login e shell interattive sono:

Una shell di login è quella il cui primo carattere dell'argomento zero è un -, oppure uno è iniziato con l'opzione --login.

Una shell interattiva è una avviata senza argomenti non opzionali e senza l'opzione -c i cui input ed errori standard sono entrambi collegati ai terminali (come determinato da isatty (3)), oppure uno avviato con l'opzione -i. PS1 è impostato e $ - include i se bash è interattivo, consentendo a uno script di shell o un file di avvio di testare questo stato.

Penso che questo significhi che possiamo avere 4 diversi tipi di shell:

  • Shell di accesso interattive,
  • Shell di login non interattive,
  • Shell interattive senza accesso,
  • Shell non interattive non di accesso

Ma perché abbiamo in primo luogo shell interattive / non interattive e login / non login? Perché la varietà? Cosa perderemmo se avessimo un solo tipo di shell?

Inoltre, quando provo a determinare se sono in una shell di login eseguendo echo $-, genera:

himBH

Alcune di queste bandiere sono spiegati qui , ma h, He mnon vengono spiegate. C'è un posto che descrive tutte queste bandiere?

Risposte:


21

Questi sono i miei pensieri sui diversi "tipi" di conchiglie - sfortunatamente non ho assistito alla nascita dell'Un * x fin dall'inizio (presumo che questo concetto sia cresciuto storicamente in buona misura), quindi per favore sii critico.

  • Quando accedo a un sistema (oggigiorno tramite l'accesso grafico X), potrebbero esserci alcune attività che dovrebbero essere eseguite una volta, ad esempio stabilire una connessione a un tipo di server, presentarmi un elenco di todo di oggi, avviare automaticamente alcuni comandi, ecc. non dovrei accontentarmi ogni volta che apro un nuovo terminale. Quindi c'è un insieme di file di configurazione ( /etc/profile, ~/.bash_logine così via, fare riferimento al manuale per un elenco accurato) di provenienza solo da accesso conchiglie.
  • Di conseguenza, per chiudere le connessioni, uccidere alcuni programmi, eseguire uno script di backup ~/.bash_logoutquando è presente la shell di accesso .
  • quindi, la shell "normale" che uso in un terminale, non dovrebbe essere una shell di accesso , ma comunque dovrei leggere le mie preferenze personali ~/.bashrc, perché voglio che i miei keybindings interagiscano con la shell - quindi questo è un interattivo, non- shell di accesso .
  • e ultimo, ma non meno importante quando bash è usato per lo scripting, nessuno di questi è importante. bashdovrebbe iniziare il più velocemente possibile, cioè non dovrebbe leggere alcun file di configurazione. Questa è una shell non interattiva, non di accesso .

Quindi, la mia risposta alla tua domanda Cosa perderemmo se avessimo un solo tipo di shell? è in una parola: "Flessibilità".


La risposta alla tua seconda domanda è semplice:

$-elenca l'attuale serie di opzioni. Questi possono essere impostati dai parametri della riga di comando su basho tramite l' setintegrato. Quindi devi guardare due punti nel manuale:

  • OPTIONS sezione:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSsezione, sottosezione 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.

1
Woo credo che la risposta di @mpy alla domanda chiaramente formulata da OP sia in grado di desambire con successo qualche definizione piuttosto utile. A proposito di ciò: Quindi, una shell non di accesso è solo un sottoinsieme della shell di accesso giusto?
tuk0z,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.