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 $SHELL
sollte die Eingabe die Shell ausgeben, an die der Befehl gesendet wird. Warum erhalte ich diese Ausgabe, nachdem ich von zu gewechselt bash
habe tcsh
?
[<dir>] <username>$ tsch
[<dir>] <username>% echo $SHELL
/bin/bash
Unter csh
Familien-Shells erhalten Sie Ihre laufende Shell mit diesem Befehl:
% echo $shell
Wenn csh
direkt 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 $SHELL
vorherigen Wert anzeigen, was verwirrend wäre.
Folgendes passiert mit Ihnen, einer der übergeordneten Prozesse Ihrer tcsh
Sitzung war bash
. Wenn bash
gestartet wird, ohne dass die SHELL
Variable 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 fish
brechen. Eine noch tragbarere Möglichkeit, dieses Problem zu umgehen, ist:
env sh -c 'basename $(ps -o comm= -p $(ps -o ppid= -p $$))'
/bin/bash
wenn ich (angeblich) von der Standardeinstellung bash
auf gewechselt habe tcsh
?tcsh
berührt die Variable nicht, SHELL
wenn sie also einen Wert hat, wenn sie tcsh
gestartet wird, bleibt es so.ps -o comm= -p $$
sollte unabhängig von der Shell funktionieren, sofern diese Shell korrekt eingestellt ist $$
, was tcsh
funktionieren sollte.csh
, tcsh
und dergleichen, die notorisch nicht POSIX sind. Answer wurde trotzdem mit einem Befehl aktualisiert, der mit viel mehr Shells funktionieren sollte, einschließlich fish
.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 $0
der 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
echo $0
und 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 tcsh
von der Standardeinstellung umschalte bash
, anstatt die Standard-Shell in den Terminal-Einstellungen auf tcsh
(oder eine andere installierte Hülse)?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 w
habe ich mit dem Befehl herausgefunden, dass der Benutzer myuser
bei console
(ignoriere diesen) und auch bei angemeldet ist s000
.
Ich habe dann ausgeführt ps -ef
und 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, tcsh
würde bash
mir 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, login
wird 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
Allan
echo $0
$SHELL ist in Ihrer .profile-Datei als Umgebungsvariable festgelegt.mmmmmm
echo $0
gibt mir nur eine Leerzeile - es gibt keine POSIX-Shells