In sostanza, indipendentemente dal fatto che una shell sia login o meno, interattiva o meno, è esattamente per un motivo:
I file di inizializzazione e le opzioni predefinite impostate dipendono dal fatto che una shell sia login o meno e interattiva o meno.
Di conseguenza, se una shell è login o meno o interattiva o meno dipende solo dall'invocazione utilizzata: il nome esatto del comando e le opzioni.
Le due proprietà sono altrimenti ortogonali: indipendentemente dal fatto che una shell sia login o meno, non ha alcuna influenza sul determinare se è interattiva o meno.
Bash avvia una shell di accesso se una di queste è vera:
argv[0]
, il nome del comando come è stato invocato, inizia con a -
- l'
-l
opzione è specificata
Simile, bash avvia una shell interattiva se una di queste è vera:
- non è stato specificato un file da eseguire (ovvero, il comando non lo era
bash some/file
) o una stringa di comando da eseguire ( bash -c 'foo'
) (la condizione effettiva è un po 'più complessa, consultare il manuale)
- l'
-i
opzione è stata specificata
In particolare (e paradossalmente), quest'ultimo implica che bash -ic 'foo'
inizia una shell interattiva.
Quindi il seguente avvia un login, shell interattiva, anche se non ha nulla di interattivo e l'invocazione non ha nulla a che fare con il login:
bash -lic true
Il fatto che l'accesso tramite console o GUI avvii una shell di accesso (o forse no) è interamente un effetto del processo di accesso che utilizza la chiamata appropriata.
Le condizioni e gli effetti sono descritti in dettaglio nel manuale di bash, sezione File di avvio .
Una delle principali fonti di confusione è che esiste un altro significato comune per la shell "login":
La shell di accesso di un utente è la shell definita nella passwd
voce di quell'utente (che può provenire da /etc/passwd
LDAP o da qualche altra fonte).
Il login
programma, SSH, ecc. Avviano questa shell come shell di login , nel senso inteso nel resto della risposta - con un -
comando iniziale nel nome del comando, di solito. Se volessi essere particolarmente confuso, potresti dire:
Alcuni processi di accesso avviano la shell di accesso dell'utente come shell di accesso.
Si noti che l'accesso alla GUI avvia una shell di accesso semplicemente perché gli sviluppatori lo hanno ritenuto conveniente - LightDM esegue uno script all'accesso che ovviamente non è interattivo e certamente non dipende dalla shell di accesso dell'utente (nel secondo senso). Tuttavia, non dipendere dal display manager che avvia una shell di accesso - non tutti lo fanno, e da Wayland e GNOME, il processo di accesso non utilizza affatto script di shell.
non-interactive login shell
è sbagliato.