Perché 'echo $ 0' dà risultati diversi per due terminali diversi?


15

Ho aperto un terminale su Ubuntu usando Ctrl+ Alt+ Te un altro terminale andando in una directory e poi facendo clic con il tasto destro e scegliendo "Apri in Terminale".

L'ho fatto echo $0in entrambi i casi.

Nel primo caso:

$ echo $0
-bash

Nel secondo caso:

$ echo $0
/bin/bash

Perché questa differenza?


$ 0 restituisce il nome del processo in esecuzione.
Ramesh,

Gestisci due terminali con utenti diversi?
cuonglm

Uso lo stesso utente
CodeBlue


Sono in realtà diversi emulatori di terminale o solo due istanze dello stesso emulatore di terminale? Sono entrambi il terminale predefinito?
terdon

Risposte:


16

Se l'output del echo $0comando è -bashsignifica che è bashstato invocato come shell di login. Se l'output è solo bash, ci si trova in una shell non di accesso.

man bash dice da qualche parte alla linea 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

Ulteriori informazioni qui: Differenza tra Shell di accesso e Shell non di accesso? .

Ora, per spiegare perché si arriva /bin/bashal secondo caso, posso dire che un programma (nel tuo caso il tuo file manager, probabilmente nautilus) o uno script può cambiare il suo $0in qualcos'altro. Ad esempio guarda cosa sta succedendo $0nel mio terminale (sempre lo stesso terminale):

inserisci qui la descrizione dell'immagine


12

La differenza sta nel modo in cui sono stati avviati. bash inizializzerà in modo diverso (leggi diversi script di avvio) a seconda del suo argv [0]. Se la stringa inizia con un trattino -come in, -bashviene eseguita come shell di accesso, in caso contrario, verrà eseguita come shell interattiva. Può anche funzionare come shell non interattiva (ad es. In uno script di shell).

Per saperne di più, è meglio leggere il manuale, man bashla sezione INVOCAZIONE.


9

Una shell viene avviato quando si effettua il login, ma è anche iniziato da programmi come make, o quando si esegue uno script di shell, o quando si digita :sha vi, o quando si crea una nuova finestra di terminale.

Inizialmente, la shell veniva letta ~/.profilequando si eseguiva il login o l'esecuzione su. Questo script farebbe cose come annunciare se si dispone di una nuova e-mail, personalizzare i caratteri di cancellazione ed eliminazione e impostare ed esportare le variabili TERM e PATH. Quando è stato avviato in quasi tutti gli altri contesti, la shell non ha letto ~/.profile, perché fare la maggior parte di queste cose sarebbe ridondante. Ci si aspettava che avessero esportato tutte le variabili shell importanti nella nuova shell.

Il modo in cui la shell sapeva se leggere ~/.profileera verificare se il primo personaggio di argv[0], aka $0, era '-'.

A partire da csh, sono stati introdotti gli alias. Gli alias non sono stati esportati nell'ambiente. cshè stato progettato per leggere in due diversi script di inizializzazione. ~/.loginè stato letto solo quando un utente ha effettuato l'accesso e lo spunto per farlo era se argv[0]iniziato con '-'. ~/.cshrcè stato letto ogni volta che è stata avviata la shell. In generale, uno ha inserito gli alias ~/.cshrce tutto il resto ~/.login. cshsupportato anche ~/.logout, che nella maggior parte dei casi ha semplicemente cancellato lo schermo ed eseguito fortune.

Altre shell hanno adottato le stesse caratteristiche. kshleggerebbe ~/.kshrc, bashleggerebbe ~/.bashrc, e quelli erano dove avresti posto le tue definizioni alias.

Quindi, per farla breve, l'applicazione che genera una shell arriva a decidere se deve essere una "shell di accesso", nel qual caso all'inizio esiste '-'una shell normale. Nella maggior parte dei casi, una shell che sarà interattiva viene avviata come shell di accesso e una shell intendeva solo eseguire alcuni comandi, come argomenti o da uno script, e quindi uscire è una shell normale.

Ma dipende tutto dal capriccio dell'applicazione che avvia la shell.

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.