Domanda Come verificare quale shell sto usando?


Ho letto che il terminale non è altro che shell e Unix fornisce 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 di default?
  • Come posso verificare quante shell sono installate?
  • Come cambio la shell utilizzata dal mio account?

236
2018-02-28 03:58


origine


Come determinare la shell corrente su cui sto lavorando? sopra stackoverflow.com - αғsнιη
@KasiyA Questo è anche correlato a askubuntu.com/questions/87853/... - d a i s y


risposte:


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 bash (Bourne Again Shell) terminale:

-bash

288
2018-02-28 04:03



è 0 una variabile di ambiente? - Mi_Onim
@ Mi_Onim $ 0 è il nome del processo in esecuzione. Se lo si utilizza all'interno di una shell, restituirà il nome della shell. Se lo usi all'interno di uno script, sarà il nome dello script. - kingmilo
NOTA: questo non funzionerà per interattivo csh. % echo $0 No file for $0. , ma funziona per tcsh - Sergiy Kolodyazhnyy
Non funziona se uno è symlink. Piace bash come sh - Anwar
@Anwar fa un buon punto, dopo aver ottenuto il nome della shell da echo $0, ls -l `which <name>`  per vedere se è collegato ad un altro binario di shell. - JivanAmara


Per trovare la shell che hai nell'ambiente predefinito puoi controllare il valore di SHELL variabile d'ambiente:

echo $SHELL

Per trovare l'istanza corrente della shell, cerca il processo (shell) che ha il PID dell'istanza corrente della shell.

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 "$$"

75
2018-02-28 04:06



$ SHELL è la shell predefinita per il sistema (o utente), che di solito è (ma non necessariamente) la shell che viene effettivamente utilizzata in un dato momento. - kingmilo
@kingmilo: Giusto sei, rispondi modificato. - heemayl
Ho trovato questo piuttosto utile quando si passa a un utente tramite 'su - <username>', ad es. per creare postgres, jenkins, ... - bully
echo $SHELL mi ha dato /bin/csh e ps -p $$ mi ha dato 22673 pts/1 00:00:00 bash. Kingmilo ha spiegato (sopra) perché non sono la stessa cosa. - 18446744073709551615
@ 18446744073709551615 Non ho neanche detto che sono uguali. Per favore leggi di nuovo attentamente la risposta; notare la predefinito e attuale formulazioni. - heemayl


$SHELL ti dà la shell di default. $0 ti dà la shell corrente.

Ad esempio: ho bash come shell di default, che utilizzo per la mia app di terminale. Ma per la mia app iTerm2, utilizzo il comando quando si apre la finestra: /bin/ksh.

Così il mio $0 mi da /bin/ksh su iTerm2. $SHELL mi da /bin/bash su iTerm2. $0,$SHELL mi da /bin/bash sul terminale


16
2017-11-18 11:45



Questa è una bella disambiguazione delle altre risposte votate dall'alto. Grazie. - Michael Hoffmann


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

echo "$SHELL"

Ad esempio, se utilizzi Bash dovresti ottenere il seguente risultato:

/bin/bash

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


5
2018-02-28 04:02



/ bin / sh è la Shell Command Language e non la Bourne Shell, per favore modifica la tua risposta. - kingmilo
@kingmilo Non c'è /bin/sh riferimento nella mia risposta - kos
@kol c'era prima della modifica. Si noti inoltre che $ SHELL è la shell predefinita per il sistema (o utente), che di solito è (ma non necessariamente) la shell che viene effettivamente utilizzata in un dato momento. - kingmilo
@kingmilo Si noti che la domanda è "quando apro il terminale quale shell è aperta di default ???" e che la risposta è "Se non hai cambiato nessuna configurazione dovrebbe essere Bash, perché questa è la shell predefinita su Ubuntu ", quindi la risposta risponde alla domanda - kos
@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


Le altre risposte tendono ad utilizzare caratteristiche specifiche della shell, ma stiamo cercando di scoprire quale shell stiamo usando, così assumono la risposta al problema. Ad esempio nessuna delle risposte funzionerà sul pesce.

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

Usa invece la sintassi $$ in una chiamata di sh, ma poi cerchiamo il PPID e non il PID. Usa il PPID per trovare il cmd.

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

Grazie per il miglioramento @muru


2
2018-04-06 04:00



Tu sai usare ppid=/cmd=per omettere le intestazioni (e quindi il tail -1s), e considera di guardare /proc/.../exe per vedere quale file viene eseguito (dal cmd l'output può essere manipolato da qualunque cosa abbia eseguito la shell). - muru
Apparentemente questo non funziona in busybox, a causa della conformità non posix: ref: github.com/broadinstitute/cromwell/pull/... - Evan Benn