Wie überprüfe ich, welche Shell ich verwende?

357

Ich habe gelesen, dass Terminal nichts als Shell ist und Unix verschiedene Shell-Varianten bietet:

  • Borowski-Schale (sh)
  • C-Shell (csh)
  • TC-Shell (tcsh)
  • Korn Shell (ksh)
  • Bourne Again Shell (Bash)

Fragen:

  • Welche Shell wird beim Öffnen eines Terminalfensters standardmäßig geöffnet?
  • Wie überprüfe ich, wie viele Shells installiert sind?
  • Wie ändere ich die von meinem Konto verwendete Shell?
LearNer969
quelle
@ KasiyA Dies ist auch im Zusammenhang mit askubuntu.com/questions/87853/…
Daisy
Bitte beachten Sie, dass das Terminal eine Schnittstelle zur Shell ist (die an einer Stelle tatsächlich eine physikalische Schnittstelle war) und die Shell kein Terminal ist - sie ist ein Befehlsinterpreter. Siehe auch askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Antworten:

427

Sie können den folgenden Befehl in Ihr Terminal eingeben, um zu sehen, welche Shell Sie verwenden:

echo $0

Das Ergebnis sieht ungefähr so ​​aus, wenn Sie das Bash- Terminal ( Bourne Again Shell ) verwenden:

-bash
Königsmilch
quelle
2
ist 0eine Umgebungsvariable?
Mi_Onim
43
@Mi_Onim $ 0 ist der Name des laufenden Prozesses. Wenn Sie es in einer Shell verwenden, wird der Name der Shell zurückgegeben. Wenn Sie es innerhalb eines Skripts verwenden, ist es der Name des Skripts.
Kingmilo
2
HINWEIS : Dies funktioniert nicht für interaktive csh. % echo $0 No file for $0., aber es funktioniert fürtcsh
Sergiy Kolodyazhnyy
2
Funktioniert nicht, wenn man symlink ist. Like bashassh
Anwar
9
@Anwar macht einen guten Punkt, nachdem Sie den Shell-Namen abgerufen haben echo $0, um ls -l `which <name>` zu sehen, ob er mit einer anderen Shell-Binärdatei verknüpft ist.
JivanAmara
121

Um die Shell in der Standardumgebung zu finden, können Sie den Wert der SHELLUmgebungsvariablen überprüfen :

echo $SHELL

Um die aktuelle Shell-Instanz zu finden, suchen Sie nach dem Prozess (Shell) mit der PID der aktuellen Shell-Instanz.

So ermitteln Sie die PID der aktuellen Shell-Instanz:

echo "$$"

So finden Sie den Prozess mit der PID:

ps -p <PID>

Etwas zusammensetzen:

ps -p "$$"
heemayl
quelle
27
$ SHELL ist die Standard-Shell für das System (oder den Benutzer), die normalerweise (aber nicht unbedingt) die Shell ist, die zu einem bestimmten Zeitpunkt tatsächlich verwendet wird.
Kingmilo
1
@kingmilo: Richtig, antworte modifiziert.
Heemayl
Ich fand das ziemlich nützlich, als ich über 'su - <Benutzername>' zu einem Benutzer wechselte, zB um Postgres, Jenkins, ... einzurichten
Bully
1
echo $SHELLgab mir /bin/cshund ps -p $$gab mir 22673 pts/1 00:00:00 bash. Kingmilo erklärte (oben), warum sie nicht gleich sind.
18446744073709551615
@ 18446744073709551615 Ich habe auch nicht gesagt, dass sie gleich sind. Bitte lesen Sie die Antwort noch einmal sorgfältig durch. Beachten Sie die Standard- und aktuellen Formulierungen.
Heemayl
25

$SHELLgibt Ihnen die Standard-Shell. $0gibt Ihnen die aktuelle Shell.

Zum Beispiel: Ich habe Bash als Standardshell, die ich für meine Terminal-App verwende. Aber für meine iTerm2 app verwende ich den Befehl als das Fenster öffnet sich : /bin/ksh.

Also mein $0gibt mir /bin/kshauf iTerm2. $SHELLgibt mir /bin/bashauf iTerm2. $0, $SHELLgibt mir /bin/basham Terminal

thenakulchawla
quelle
2
Dies ist eine nette Disambiguierung der anderen Antworten, die am häufigsten gewählt wurden. Danke.
Michael Hoffmann
Für mich ist zsh installiert und es ist die aktuelle Standardeinstellung. Um zu bash zu wechseln, muss ich nur bashdas Terminal eingeben. Um zu zsh zurückzukehren, geben Siezsh
Yousuf Azad
8

Um zu wissen, welches die Standardshell für Ihren Benutzer ist, können Sie Folgendes ausführen:

echo "$SHELL"

Wenn Sie beispielsweise Bash verwenden, sollten Sie die folgende Ausgabe erhalten:

/bin/bash

Wenn Sie keine Konfiguration geändert haben, sollte dies Bash sein, da Bash die Standard-Shell unter Ubuntu ist.

kos
quelle
/ bin / sh ist die Shell-Befehlssprache und nicht die Bourne-Shell. Bitte bearbeiten Sie Ihre Antwort.
Kingmilo
@kingmilo Es gibt keinen /bin/shHinweis in meiner Antwort
Kos
@kol gab es vor dem bearbeiten. Bitte beachten Sie auch, dass $ SHELL die Standard-Shell für das System (oder den Benutzer) ist, die normalerweise (aber nicht unbedingt) die Shell ist, die zu einem bestimmten Zeitpunkt tatsächlich verwendet wird.
Kingmilo
1
@kingmilo Lesen Sie die Antwort noch einmal, ich glaube, ich verstehe, was Sie angeht, wahrscheinlich habe ich mich nicht gut ausgedrückt. Ich habe die Bedeutung von "derzeit" in meiner Antwort geklärt
kos
1
@ Frederickjh Fisch ist ein bisschen seltsam hier draußen. Die $$Variable wird tatsächlich von POSIX definiert und funktioniert auf den meisten Shells. Fish hat beschlossen, sich hier nicht an den Standard zu halten, daher halte ich es für angemessen, ihn zu ignorieren. Ich kann bestätigen, dass $$es in sh, dash, bash, zsh, ksh, ash, tcsh und csh wie erwartet funktioniert. Tatsächlich fällt mir keine andere Muschel ein, als Fisch, bei dem es nicht funktioniert.
Terdon
8

Bei den anderen Antworten werden in der Regel Shell-spezifische Funktionen verwendet. Wir versuchen jedoch herauszufinden, welche Shell wir verwenden, und nehmen daher die Antwort auf das Problem an. Zum Beispiel funktioniert keine der Antworten bei Fischen.

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

Verwenden Sie stattdessen die $$ -Syntax in einem Aufruf von sh, aber dann suchen wir nach der PPID und nicht nach der PID. Verwenden Sie die PPID, um die cmd zu finden.

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

Danke für die Verbesserung @muru

Evan Benn
quelle
2
Sie können ppid=/ verwenden cmd=, um die Header (und damit die tail -1s) wegzulassen , und überlegen /proc/.../exe, welche Datei gerade ausgeführt wird (da die cmdAusgabe von jedem Programm bearbeitet werden kann, das die Shell ausführt).
muru
1
Anscheinend funktioniert dies nicht in der Busybox, da die Posix-Richtlinien nicht eingehalten werden: ref: github.com/broadinstitute/cromwell/pull/…
Evan Benn
4

Der ursprüngliche Beitrag stellte drei Fragen. Die Antworten beziehen sich auf die erste Frage: "Wenn ich ein Terminalfenster öffne, welche Shell wird standardmäßig geöffnet?" Sie beantworten auch eine Frage, die NICHT gestellt wurde: "Wie kann ich herausfinden, welche Shell derzeit im Terminal ausgeführt wird?" Soweit ich jedoch sehen kann, hat noch niemand die ursprünglich gestellte zweite oder dritte Frage beantwortet, nämlich "Wie überprüfe ich, wie viele Shells installiert sind?" und "Wie ändere ich die von meinem Konto verwendete Shell?"

  • So beantworten Sie die Frage "Wie überprüfe ich, wie viele Shells installiert sind?" Der folgende Befehl listet alle verfügbaren Shells auf:

Katze / etc / Muscheln

Beispielsweise ergibt sich bei einer Standardinstallation von Ubuntu 18.10 Folgendes:

# / etc / shells: Gültige Login-Shells

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

Standardmäßig ist sh jedoch eine symbolische Verknüpfung zum Bindestrich, während rbash Verknüpfungen zur Bash mit der Option -r ("eingeschränkte Bash") enthält, sodass tatsächlich nur zwei Shells vorhanden sind, nicht vier, wie in der obigen Liste angegeben. Der folgende Befehl zeigt Ihnen, ob es sich bei einer der aufgelisteten Shells tatsächlich um symbolische Verknüpfungen handelt und wo diese verknüpft sind: ls -l / bin

  • Nun zur Frage "Wie ändere ich die von meinem Konto verwendete Shell?" Angenommen, dies bedeutet "Wie ändere ich die von einem Terminal verwendete Standard-Shell dauerhaft ?"
Michael D
quelle