Wie können Sie im Terminal feststellen, welche Shell tatsächlich ausgeführt wird?

Wenn Sie Terminal unter OS X 10.11.4 verwenden, wird beim Initialisieren von Terminal ein neues Fenster geöffnet bash(standardmäßig). Soweit ich weiß, echo $SHELLsollte die Eingabe die Shell ausgeben, an die der Befehl gesendet wird. Warum erhalte ich diese Ausgabe, nachdem ich von zu gewechselt bashhabe tcsh?

[<dir>] <username>$ tsch
[<dir>] <username>% echo $SHELL
/bin/bash
Try echo $0$SHELL ist in Ihrer .profile-Datei als Umgebungsvariable festgelegt.
@Allan - echo $0gibt mir nur eine Leerzeile - es gibt keine POSIX-Shells

Antworten (4)

Unter cshFamilien-Shells erhalten Sie Ihre laufende Shell mit diesem Befehl:

% echo $shell

Wenn cshdirekt oder indirekt von einer Shell der Bourne-Familie ausgeführt wurde, deren SHELL-Variable exportiert wurde, wobei letzteres der häufigste Fall ist, würde die SHELL-Variable unberührt bleiben und weiterhin ihren echo $SHELLvorherigen Wert anzeigen, was verwirrend wäre.

Folgendes passiert mit Ihnen, einer der übergeordneten Prozesse Ihrer tcshSitzung war bash. Wenn bashgestartet wird, ohne dass die SHELLVariable gesetzt ist, wird sie auf den Pfad zu gesetzt bash, ungeachtet dessen, was in der Dokumentation angegeben ist. Beachten Sie, dass das Starten einer neuen Bourne-Shell-Familie auch die SHELL-Variable nicht geändert hätte, wenn sie gesetzt wäre. SHELL ist definitiv nicht der Weg, um zu identifizieren, welche Shell Sie ausführen, sondern nur um zu wissen, welche Shell Ihre Standard-Shell ist, wenn Sie sich in einer POSIX-Umgebung befinden.

Ein portabler Weg, um zu wissen, welche Shell gerade läuft, wäre:

ps -o comm= -p $$

Der letztere Befehl setzt jedoch voraus, $$dass er auf die aktuelle Prozess-PID gesetzt ist, die leider einige exotische Shells wie fishbrechen. Eine noch tragbarere Möglichkeit, dieses Problem zu umgehen, ist:

env sh -c 'basename $(ps -o comm= -p $(ps -o ppid= -p $$))'
Richtig: aber gemäß meiner Frage, warum wird dies ausgegeben, /bin/bashwenn ich (angeblich) von der Standardeinstellung bashauf gewechselt habe tcsh?
Antwort aktualisiert. tcshberührt die Variable nicht, SHELLwenn sie also einen Wert hat, wenn sie tcshgestartet wird, bleibt es so.
Die gepostete portable Antwort ps -o comm= -p $$sollte unabhängig von der Shell funktionieren, sofern diese Shell korrekt eingestellt ist $$, was tcshfunktionieren sollte.
Diese tragbare Antwort schlägt bei Fischen fehl, daher denke ich, dass sie auch nur eine POSIX-Antwort ist
@Mark nein, es ist nicht POSIX, nur angesichts der Tatsache, dass es mit funktioniert csh, tcshund dergleichen, die notorisch nicht POSIX sind. Answer wurde trotzdem mit einem Befehl aktualisiert, der mit viel mehr Shells funktionieren sollte, einschließlich fish.
Es funktioniert mit Fischen und gibt den vollständigen Pfad zu den abscheulichen Muscheln an, nicht nur den Muschelnamen
@Mark Answer aktualisiert, um es zu umgehen.
@jlliagre Ich schätze die gründliche Antwort, die Sie hier zusammengestellt haben, sehr. Ich mag die Idee nicht, mich zu ändern, nachdem ich bereits eine Antwort akzeptiert habe, aber in diesem Fall ist Ihre Antwort die beste.

Es hängt von der Shell ab, in der Sie laufen.

Wenn es sich um eine POSIX-bestätigende Shell handelt, z. B. bash, ash, ash, sh, und einige andere, z. B. csh, tcsh, wird echo $0der Name der Shell zurückgegeben

z.B

~ $ bash
bash-3.2$ echo $0
bash

oder

~ $ ksh
$ echo $0
ksh

Allerdings sind nicht alle Shells POSIX, z. B. habe ich früher das Ipython-Shell-Profil verwendet und jetzt gefischt

Ah, ja: Ich habe eingegeben echo $0und die erwartete Ausgabe erhalten: tcsh. Ich werde fortfahren und diese Antwort akzeptieren, da sie das spezifische Beispiel löst, das ich gegeben habe. Davon abgesehen, wissen Sie, ob tcsh(oder eine andere Shell für diese Angelegenheit) in einer Art "emuliertem" Zustand ausgeführt wird, wenn ich tcshvon der Standardeinstellung umschalte bash, anstatt die Standard-Shell in den Terminal-Einstellungen auf tcsh(oder eine andere installierte Hülse)?
@WatermarkBranding Das Ausführen von tcsh über die Befehlszeile entspricht dem Ausführen als Standard-Shell (außer dass es von Terminal als Anmelde-Shell aufgerufen wird).
Ich weiß Ihre prompte Antwort wirklich zu schätzen (und eine, die zur Lösung des Beispiels beigetragen hat, das ich gegeben habe). Das heißt, fairerweise beantwortet die Antwort von jllagre die Frage gründlicher. Ich werde Ihre Antwort trotzdem positiv bewerten. Am besten.

Eine andere Möglichkeit wäre, zu überprüfen, an welches TTY Ihr Terminal angeschlossen ist, und zu überprüfen, welche Shell auf diesem TTY ausgeführt wird. Dann könnten Sie sich die PID (Prozess-ID) und PPID (Elternprozess-ID) ansehen, falls Ihre Shell eine andere Shell als untergeordneten Prozess hervorgebracht hat:

MacBook:~$ w
15:16  up 8 days, 16:11, 2 users, load averages: 1.26 1.22 1.24
USER     TTY      FROM              LOGIN@  IDLE WHAT
myuser   console  -                19Apr16 8days -
myuser   s000     -                15:15       - w
MacBook:~$ ps -ef | grep s000
UID   PID  PPID   C STIME   TTY           TIME CMD
    0 23865   293   0  3:15PM ttys000    0:00.14 login -pf myuser /bin/bash
  501 23866 23865   0  3:15PM ttys000    0:00.05 -bash
    0 23992 23866   0  3:16PM ttys000    0:00.01 ps -ef
  501 23993 23866   0  3:16PM ttys000    0:00.00 grep s000
MacBook:~$ 

Im obigen Beispiel whabe ich mit dem Befehl herausgefunden, dass der Benutzer myuserbei console(ignoriere diesen) und auch bei angemeldet ist s000.

Ich habe dann ausgeführt ps -efund nur die PID- und PPID-Spalten angesehen, ich kann sehen, dass login(PID 23865) ausgeführt wurde bash(PID 23866, PPID 23865), was dann zwei Prozesse ausgeführt hat: ps -ef(PID 23992, PPID 23866) und grep s000(PID 23993 PPID 23866 ).

Wenn ich aus irgendeinem Grund von ausgeführt habe, tcshwürde bashmir das Ausführen der obigen Befehle immer noch erlauben zu sehen, von welcher Shell mein aktueller Befehl ausgeführt wird.

Wenn Sie eine Terminalsitzung in OS X starten, loginwird das Dienstprogramm aufgerufen.

Aus der Manpage:

The login utility enters information into the environment (see environ(7)) specifying the user's home directory (HOME), command inter-
preter (SHELL), search path (PATH), terminal type (TERM) and user name (both LOGNAME and USER).

Some shells may provide a builtin login command which is similar or identical to this utility.  Consult the builtin(1) manual page.

Beachten Sie die Optionen, die beim Aufruf des Dienstprogramms verwendet werden, und lesen Sie dann die Manpage:

ps -ef | grep -w [l]ogin

Einige dieser Informationen stammen aus Ihrem Eintrag in Opendirectory.

dscl . -read /Users/your_user_name RecordName UserShell NFSHomeDirectory