Come posso verificare quale shell sto usando?


359

Ho letto che il terminale non è altro che shell e Unix offre diversi tipi di shell:

  • Bourne shell (sh)
  • C shell (csh)
  • TC shell (tcsh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)

Domande:

  • Quando apro una finestra di terminale, quale shell è aperta per impostazione predefinita?
  • Come posso verificare quante shell sono installate?
  • Come posso cambiare la shell utilizzata dal mio account?


@KasiyA Questo è anche correlato a askubuntu.com/questions/87853/…
daisy,

Nota che il terminale è un'interfaccia con la shell (che a un certo punto era in realtà un'interfaccia fisica), e la shell non è un terminale - è un interprete di comandi. Vedi anche askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Risposte:


429

Puoi digitare il seguente comando nel tuo terminale per vedere quale shell stai usando:

echo $0

Il risultato sarà simile al seguente se si utilizza il terminale bash ( Bourne Again Shell ):

-bash

2
è 0una variabile d'ambiente?
Mi_Onim,

43
@Mi_Onim $ 0 è il nome del processo in esecuzione. Se lo usi all'interno di una shell, restituirà il nome della shell. Se lo usi all'interno di uno script, sarà il nome dello script.
Kingmilo,

2
NOTA : questo non funzionerà per interattivo csh. % echo $0 No file for $0., ma funziona pertcsh
Sergiy Kolodyazhnyy,

2
Non funziona se quando si è symlink. Come bashcomesh
Anwar

9
@Anwar ha ragione, dopo aver ottenuto il nome della shell echo $0, ls -l `which <name>` per vedere se è collegato a un altro binario della shell.
JivanAmara,

121

Per trovare la shell che hai nell'ambiente predefinito puoi controllare il valore della SHELLvariabile d'ambiente:

echo $SHELL

Per trovare l'istanza della shell corrente, cercare il processo (shell) con il PID dell'istanza della shell corrente.

Per trovare il PID dell'istanza corrente della shell:

echo "$$"

Ora per trovare il processo con il PID:

ps -p <PID>

Mettendolo insieme:

ps -p "$$"

27
$ SHELL è la shell predefinita per il sistema (o l'utente), che di solito è (ma non necessariamente) la shell che viene effettivamente utilizzata in un dato momento.
Kingmilo,

1
@kingmilo: Esatto, risposta modificata.
heemayl,

L'ho trovato abbastanza utile quando sono passato a un utente tramite 'su - <nomeutente>', ad es. Per impostare postgres, jenkins, ...
bully

1
echo $SHELLmi ha dato /bin/cshe ps -p $$mi ha dato 22673 pts/1 00:00:00 bash. Kingmilo ha spiegato (sopra) perché non sono gli stessi.
18446744073709551615

@ 18446744073709551615 Non ho detto neanche che sono uguali. Si prega di leggere di nuovo attentamente la risposta; prendere nota delle formulazioni predefinite e correnti .
heemayl,

25

$SHELLti dà la shell predefinita. $0ti dà la shell corrente.

Ad esempio: ho bash come shell predefinita, che utilizzo per la mia App terminale. Ma per il mio iTerm2 app, io uso il comando come si apre la finestra: /bin/ksh.

Quindi il mio $0mi dà /bin/kshsu iTerm2. $SHELLmi dà /bin/bashsu iTerm2. $0, $SHELLmi dà /bin/bashsul Terminal


2
Questa è una bella chiarimento delle altre risposte più votate. Grazie.
Michael Hoffmann,

Per me, ho installato zsh ed è l'attuale impostazione predefinita, per passare a bash, tutto ciò che devo fare è digitare bashil terminale. Per tornare a zsh, digitarezsh
Yousuf Azad il

8

Per sapere qual è la shell predefinita per il tuo utente, puoi eseguire:

echo "$SHELL"

Ad esempio se stai usando Bash dovresti ottenere il seguente output:

/bin/bash

Se non hai modificato alcuna configurazione, dovrebbe essere Bash poiché Bash è la shell predefinita su Ubuntu.


/ bin / sh è il linguaggio di comando della shell e non la shell Bourne, modifica la risposta.
Kingmilo,

@kingmilo Non c'è /bin/shriferimento nella mia risposta
kos,

@kol c'era prima della modifica. Si noti inoltre che $ SHELL è la shell predefinita per il sistema (o l'utente), che di solito è (ma non necessariamente) la shell che viene effettivamente utilizzata in un dato momento.
Kingmilo,

1
@kingmilo Leggendo di nuovo la risposta, penso di capire qual è la tua preoccupazione, probabilmente non mi sono espresso bene. Ho chiarito il significato di "attualmente" nella mia risposta
kos,

1
@frederickjh fish è un po 'strano qui. La $$variabile è in realtà definita da POSIX e funzionerà sulla maggior parte delle shell. Fish ha deciso di non seguire lo standard qui, quindi penso che sia giusto ignorarlo. Posso confermare che $$funziona come previsto in sh, dash, bash, zsh, ksh, ash, tcsh e csh. In effetti, dalla parte superiore della mia testa non riesco a pensare a nessun altro guscio, tranne i pesci dove non funziona.
terdon

8

Le altre risposte tendono a utilizzare funzionalità specifiche della shell, ma stiamo cercando di scoprire quale shell stiamo utilizzando, quindi assumono la risposta al problema. Ad esempio, nessuna delle risposte funzionerà sui pesci.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

Invece usa la sintassi $$ in una chiamata di sh, ma poi stiamo cercando il PPID e non il PID. Utilizzare il PPID per trovare il cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Grazie per il miglioramento @muru


2
Puoi usare ppid=/ cmd=per omettere le intestazioni (e quindi le tail -1s) e considerare /proc/.../exedi vedere quale file è in esecuzione (poiché l' cmdoutput può essere manipolato da qualunque cosa abbia eseguito la shell).
muru,

1
Apparentemente questo non funziona in busybox, a causa della conformità non posix: ref: github.com/broadinstitute/cromwell/pull/…
Evan Benn,

4

Il post originale poneva tre domande. Le risposte fornite coprono la prima domanda: "Quando apro una finestra di terminale, quale shell è aperta di default?" Rispondono anche a una domanda che NON è stata posta, ovvero "Come posso sapere quale shell è attualmente in esecuzione nel terminale?" Tuttavia, per quanto posso vedere nessuno ha risposto alla seconda o alla terza domanda originariamente poste, vale a dire "Come posso verificare quante shell sono installate?" e "Come posso cambiare la shell utilizzata dal mio account?"

  • Per rispondere "Come posso verificare quante shell sono installate?" il seguente comando elencherà tutte le shell disponibili:

cat / etc / shells

Ad esempio, su un'installazione predefinita di Ubuntu 18.10 questo dà:

# / etc / shells: shell di login valide

/ Bin / sh

/ Bin / dash

/ Bin / bash

/ Bin / rbash

Tuttavia, per impostazione predefinita sh è un collegamento simbolico a trattino, mentre rbash si collega a bash con l'opzione -r ("bash limitato"), quindi in realtà ci sono solo due shell, non quattro come suggerisce l'elenco sopra. Il seguente comando ti mostrerà se una qualsiasi delle shell elencate è in realtà un collegamento simbolico, e in tal caso dove si collegano a: ls -l / bin

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.