Wie ermittle ich die aktuelle Shell, an der ich gerade arbeite?
Wie kann ich ermitteln der aktuellen shell arbeite ich an?
Würde der Ausgang des ps
Befehl allein ausreichend?
Wie kann das sein, verschiedene UNIX-Geschmacksrichtungen?
InformationsquelleAutor der Frage joshu | 2010-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es 3 Ansätze zu finden, die Namen der aktuellen shell ausführbar:
Bitte beachten Sie, dass alle 3 Verfahren können täuschen, wenn die ausführbare Datei der shell ist
/bin/sh
aber es ist wirklich eine umbenanntebash
zum Beispiel (was Häufig passiert).So Ihre zweite Frage, ob
ps
Ausgabe zu tun ist, beantwortet mit "nicht immer".echo $0
- druckt den Namen des Programms... das im Fall von shell ist das eigentliche shell -ps -ef | grep $$ | grep -v grep
- Dies sieht für die aktuelle Prozess-ID in der Liste der Laufenden Prozesse. Da der aktuelle Prozess ist eine Schale, die Sie aufgenommen werden.Ist das nicht 100% zuverlässig, da Sie möglicherweise ANDERE Prozesse, deren
ps
Auflistung enthält die gleiche Anzahl wie shell Prozess-ID, vor allem, wenn diese ID ist eine kleine # (z.B. bei shell die PID ist "5", können Sie feststellen Prozessen, dem so genannten "java5" oder "perl5" im gleichengrep
Ausgabe!). Dies ist das zweite problem mit den "ps" - Ansatz, die oben nicht in der Lage, verlassen sich auf die shell-Namen.echo $SHELL
- Der Pfad der aktuellen shell gespeichert ist, als dieSHELL
Variablen für die shell. Der Nachteil bei dieser ist, dass, wenn Sie starten Sie eine shell explizit als Unterprozess (es ist z.B. nicht als login-shell), erhalten Sie Ihre login-shell ist-Wert statt. Wenn das ist eine Möglichkeit, verwenden Sie dieps
oder$0
Ansatz.Wenn jedoch die ausführbare Datei passt nicht zu Ihrem eigentlichen Hülle (z.B.
/bin/sh
ist eigentlich bash oder ksh), benötigen Sie Heuristiken. Hier sind einige Umwelt-Variablen, die spezifisch für verschiedene shells:$version
liegt auf tcsh$BASH
liegt auf bash$shell
(Kleinbuchstaben) auf die tatsächlichen shell-name in csh oder tcsh$ZSH_NAME
liegt auf zshksh hat
$PS3
und$PS4
gesetzt, während die normalen Bourne-shell (sh
) hat nur$PS1
und$PS2
gesetzt. Diese Regel scheint, wie das am schwersten zu unterscheiden, der EINZIGE Unterschied in der gesamten Reihe von envionmental Variablen zwischensh
undksh
wir haben installiert, die auf Solaris Kisten ist$ERRNO
$FCEDIT
$LINENO
$PPID
$PS3
$PS4
$RANDOM
$SECONDS
$TMOUT
.InformationsquelleAutor der Antwort DVK
ps -p $$
sollten überall arbeiten, dass die Lösungen mit
ps -ef
undgrep
tun (auf jeder Unix-Variante, die unterstützt POSIX-Optionen fürps
) und wird nicht leiden, von den falschen positiven eingeführt grepping für eine Folge von Ziffern erscheinen an anderer Stelle.InformationsquelleAutor der Antwort Matthew Slattery
Versuchen
oder
InformationsquelleAutor der Antwort Nahuel Fouilleul
Wenn Sie nur wollen, um sicherzustellen, Benutzer aufrufen-Skript mit der bash:
InformationsquelleAutor der Antwort Peter Lamberg
Können Sie versuchen:
Oder:
InformationsquelleAutor der Antwort karlphillip
$SHELL
müssen nicht immer zeigen die aktuelle shell. Es spiegelt nur die default-shell aufgerufen werden.Testen den oben genannten, Sagen
bash
ist die Standard-shell versuchenecho $SHELL
dann in der gleichen Klemme ,in einer anderen shell(ksh zum Beispiel) und versuchen$SHELL
sehen Sie das Ergebnis als bash in beiden Fällen.Um den Namen der aktuellen shell Verwenden
cat /proc/$$/cmdline
Und den Pfad zu der shell ausführbar durchreadlink /proc/$$/exe
InformationsquelleAutor der Antwort Sibi Rajasekaran
ps ist die zuverlässigste Methode. Die SHELL envar ist nicht gewährleistet, festgelegt werden, und selbst wenn es ist, kann es problemlos manipuliert werden
InformationsquelleAutor der Antwort ennuikiller
Habe ich einen einfachen trick, um die Suche nach der aktuellen shell. Geben Sie einfach eine zufällige Zeichenfolge (das ist kein Befehl). Sie werden scheitern und wieder eine "nicht gefunden" - Fehler, aber beim start der Linie wird es sagen, die Schale ist es:
InformationsquelleAutor der Antwort user5659949
Diese geben immer den aktuellen shell verwendet - wird der name der ausführbaren Datei und nicht shell-name (D. H.
ksh93
stattksh
etc.) Für/bin/sh
zeigt die aktuelle shell verwendet: d.h.dash
Ich weiß, hier sind viele, die sagen:
ls
Ausgabe sollte sein, neuere verarbeitet, aber was ist die Wahrscheinlichkeit, Sie werden ein shell Sie verwenden, Namen mit Sonderzeichen oder in einem Verzeichnis namens mit Sonderzeichen? Wenn noch ist dies der Fall, hier sind viele andere Beispiele macht es anders.InformationsquelleAutor der Antwort vadimbog
Meine Variante auf Druck der Eltern-Prozess.
Warum führen Sie unnötige Anwendungen, wenn 'awk' kann es für Sie tun?
InformationsquelleAutor der Antwort Matthew Stier
Vorausgesetzt, dass Ihr
/bin/sh
unterstützt den POSIX standard und Ihr system hat dielsof
Befehl installiert - eine mögliche alternative zulsof
in diesem Fall könntepid2path
- Sie können auch (oder anpassen) das folgende Skript druckt vollständige Pfade:InformationsquelleAutor der Antwort carlo
Habe ich versucht viele verschiedene Ansätze und die beste für mich ist:
ps -p $$
Funktioniert es auch unter Cygwin und kann Fehlalarme zu erzeugen, die als PID-grepping. Mit etwas Reinigung, gibt es nur eine ausführbare Datei (unter Cygwin mit Pfad):
Können Sie eine Funktion erstellen, so dass Sie nicht haben, um es auswendig zu lernen:
...und dann einfach ausführen
shell
.Getestet unter Debian und Cygwin.
InformationsquelleAutor der Antwort Dawid Ferenczy
vom http://www.unix.com/unix-dummies-questions-answers/10390-how-do-you-know-what-your-current-shell.html
InformationsquelleAutor der Antwort Moisei
Unter Mac OS X (& FreeBSD):
InformationsquelleAutor der Antwort zaga
Wenn Sie nur wollen, um zu überprüfen, dass Sie ausgeführt werden (eine Besondere version) Bash,
der beste Weg, dies zu tun, ist die Verwendung der
$BASH_VERSINFO
array-Variablen.Als eine (readonly) array-variable kann nicht gesetzt werden, in der Umwelt,
so können Sie sicher sein, dass es kommt (wenn überhaupt) aus der aktuellen shell.
Jedoch, da die Bash unterschiedliches Verhalten beim aufrufen, als
sh
,Sie müssen auch prüfen, ob die
$BASH
Umgebungsvariable endet mit/bash
.In einem Skript, das ich schrieb, verwendet die Funktion den Namen mit
-
(nicht unterstreichen)und hängt davon ab, assoziative arrays (Hinzugefügt in Bash 4),
Ich habe Folgendes sanity-check (mit hilfreichen user error message):
Könnten Sie weglassen, das etwas paranoid, Funktionsprüfung für Funktionen im ersten Fall,
und einfach davon ausgehen, dass zukünftige bash-Versionen kompatibel sein würde.
InformationsquelleAutor der Antwort Alex Dupuy
Grepping PID aus der Ausgabe von "ps" ist nicht nötig, denn Sie kann Lesen Sie entsprechenden Befehl Zeile für jede PID vom /proc-Verzeichnis-Struktur:
Allerdings, das könnte nicht besser sein, als einfach nur:
Rund laufen eigentlich andere shell als der name deutet an, eine Idee ist, die Anfrage-version von shell mit dem Namen, den Sie bekam vorher:
sh scheint fehl mit exit-code 2 während andere etwas nützliches (aber ich bin nicht in der Lage zu überprüfen, ob alle, da ich diese nicht haben):
InformationsquelleAutor der Antwort ajaaskel
Keiner Antworten arbeitete mit
fish
shell (es müssen keine Variablen$$
oder$0
).Diese funktioniert bei mir (getestet auf
sh
bash
fish
ksh
csh
true
tcsh
undzsh
; openSUSE 13.2):Dieser Befehl gibt Strings wie
bash
. Ich verwende hier nurps
tail
undsed
(ohne GNU-extesions; versuchen Sie, fügen Sie--posix
um es zu überprüfen). Sie sind alle standard-POSIX-Kommandos. Ich bin mir sicher, dasstail
entfernt werden kann, aber meinesed
fu ist nicht stark genug, dies zu tun.Scheint es mir, dass diese Lösung nicht sehr portabel, wie es funktioniert nicht auf OS X. 🙁
InformationsquelleAutor der Antwort rominf
Dies ist keine sehr saubere Lösung, aber tut, was Sie wollen.
Merke ich, dass die Antwort ein bisschen spät in diesem guten alten Jahr 2015, aber...
Jetzt können Sie
$(getshell) --version.
Diese funktioniert, jedoch nur auf ksh-shells.
InformationsquelleAutor der Antwort theoden
Meine Lösung:
Diese sollte portabel auf verschiedenen Plattformen und Muscheln. Es nutzt
ps
wie andere Lösungen, aber es verlässt sich nicht aufsed
oderawk
und filtert junk aus Rohrleitungen undps
selbst, so dass die Schale sollte immer der Letzte Eintrag. Auf diese Weise brauchen wir nicht brauchen, sich auf nicht-portable PID-Variablen oder Kommissionierung die richtigen Zeilen und Spalten.Habe ich getestet auf Debian und MacOS mit bash, zsh, fish (das funktioniert nicht mit den meisten dieser Lösungen ohne Veränderung des Ausdrucks, die speziell für die Fisch, weil es eine andere PID-variable).
InformationsquelleAutor der Antwort wickles
Gibt es viele Möglichkeiten, um herauszufinden, die shell und der entsprechenden version. Hier sind einige, die für mich gearbeitet.
Geradlinig
Hackish Ansatz
$> ******* (Geben Sie eine Reihe von zufälligen Zeichen und in der Ausgabe erhalten Sie die shell-Namen. In meinem Fall -bash: kapitel2-ein-Beispiel-isomorph-app: Befehl nicht gefunden)
InformationsquelleAutor der Antwort Devang Paliwal
Nutzen Sie bitte unten Befehl:
InformationsquelleAutor der Antwort Ranjithkumar T
Tun das folgende, um zu wissen, ob Ihre Shell DASH/BASH.
1) ls –la /bin/sh
wenn das Ergebnis /bin/sh ->/bin/bash ==> Dann wird Ihre shell ist die BASH benutzen.
wenn das Ergebnis /bin/sh ->/bin/dash ==> Dann wird Ihre shell DASH.
Wenn Sie ändern möchten, BASH, DASH oder Umgekehrt, verwenden Sie den folgenden code
ln -s /bin/bash /bin/sh (change shell BASH)
HINWEIS: Wenn der obige Befehl erzeugt eine Fehlermeldung, /bin/sh bereits vorhanden ist, entfernen Sie die /bin/sh und versuchen Sie es erneut.
InformationsquelleAutor der Antwort Shiva
Dieser arbeitet auch auf RHEL, MacOS, BSD und einige AIXes
alternativ, folgenden man sollte auch funktionieren, wenn pstree verfügbar ist,
InformationsquelleAutor der Antwort martin zahrubsky