Wie kann ich die aktuelle Shell, an der ich arbeite, bestimmen?
Würde die Ausgabe des ps
Befehl allein ausreichend sein?
Wie kann dies in verschiedenen Unix-Varianten geschehen?
Wie kann ich die aktuelle Shell, an der ich arbeite, bestimmen?
Würde die Ausgabe des ps
Befehl allein ausreichend sein?
Wie kann dies in verschiedenen Unix-Varianten geschehen?
Es gibt drei Ansätze zur Ermittlung der Name der ausführbaren Datei der aktuellen Shell:
Bitte beachten Sie, dass alle drei Ansätze überlistet werden können, wenn die ausführbare Datei der Shell /bin/sh
aber in Wirklichkeit ist es ein umbenanntes bash
zum Beispiel (was häufig vorkommt).
Daher ist Ihre zweite Frage, ob ps
Ausgabe wird mit " nicht immer ".
echo $0
- gibt den Programmnamen aus... der im Fall der Shell die eigentliche Shell ist.
ps -ef | grep $$ | grep -v grep
- wird nach der aktuellen Prozess-ID in der Liste der laufenden Prozesse gesucht. Da der aktuelle Prozess die Shell ist, wird er einbezogen.
Dies ist nicht 100 % zuverlässig, da Sie möglicherweise andere Prozesse, deren ps
Auflistung die gleiche Nummer wie die Prozess-ID der Shell enthält, insbesondere wenn diese ID eine kleine Zahl ist (wenn die PID der Shell beispielsweise "5" ist, finden Sie möglicherweise Prozesse namens "java5" oder "perl5" in der gleichen grep
Ausgabe!). Dies ist das zweite Problem mit dem "ps"-Ansatz, zusätzlich zu der Tatsache, dass man sich nicht auf den Shellnamen verlassen kann.
echo $SHELL
- Der Pfad zur aktuellen Shell wird in der Datei SHELL
Variable für jede Shell. Wenn Sie eine Shell explizit als Unterprozess starten (z.B. wenn es nicht Ihre Login-Shell ist), erhalten Sie stattdessen den Wert Ihrer Login-Shell. Wenn das eine Möglichkeit ist, verwenden Sie die ps
o $0
Ansatz.
Wenn jedoch die ausführbare Datei nicht mit Ihrer aktuellen Shell übereinstimmt (z. B. /bin/sh
ist eigentlich bash oder ksh), brauchen Sie Heuristiken. Hier sind einige Umgebungsvariablen, die für verschiedene Shells spezifisch sind:
$version
auf tcsh eingestellt ist
$BASH
auf bash eingestellt ist
$shell
(Kleinbuchstaben) wird auf den tatsächlichen Shell-Namen in csh oder tcsh gesetzt
$ZSH_NAME
auf zsh eingestellt ist
ksh hat $PS3
y $PS4
gesetzt, während die normale Bourne-Shell ( sh
) hat nur $PS1
y $PS2
gesetzt. Dies scheint im Allgemeinen am schwierigsten zu unterscheiden zu sein - die nur Unterschied im gesamten Satz der Umgebungsvariablen zwischen sh
y ksh
die wir auf Solaris-Boxen installiert haben, ist $ERRNO
, $FCEDIT
, $LINENO
, $PPID
, $PS3
, $PS4
, $RANDOM
, $SECONDS
et $TMOUT
.
ps -p $$
sollte überall dort funktionieren, wo die Lösungen mit ps -ef
y grep
tun (auf jeder Unix-Variante, die die POSIX-Optionen für ps
) und leidet nicht unter den falsch-positiven Ergebnissen, die durch die Suche nach einer Ziffernfolge entstehen, die auch anderswo vorkommen kann.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.