797 Stimmen

Wie kann ich die aktuelle interaktive Shell ermitteln, in der ich mich befinde (Befehlszeile)?

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?

953voto

DVK Punkte 123218
  • 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 ".

    1. echo $0 - gibt den Programmnamen aus... der im Fall der Shell die eigentliche Shell ist.

    2. 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.

    3. 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 .

130voto

Matthew Slattery Punkte 43123

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.

54voto

Nahuel Fouilleul Punkte 17814

Versuchen Sie

ps -p $$ -oargs=

oder

ps -p $$ -ocomm=

47voto

Peter Lamberg Punkte 7417

Wenn Sie nur sicherstellen wollen, dass der Benutzer ein Skript mit der Bash aufruft:

if [ -z "$BASH" ] ;then echo "Please run this script $0 with bash"; exit 1; fi

24voto

karlphillip Punkte 89618

Sie können es versuchen:

ps | grep `echo $$` | awk '{ print $4 }'

Oder:

echo $SHELL

CodeJaeger.com

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.

Powered by:

X