Ich suche nach einer einfachen und zuverlässigen Möglichkeit, den Namen der aktuellen Shell aus einem Skript oder einer Quelldatei ( nicht über die Befehlszeile) abzurufen . Ich hätte erwartet, nur zu tun, $(basename "$SHELL")
aber wenn meine Login-Shell ist zsh
und ich den folgenden Code in some_script.sh habe
this_shell=$( basename "$SHELL" )
echo "The Shell is $this_shell"
echo "The Shell is $0"
und ich führe es mit aus bash some_script.sh
, es listet immer noch zsh
statt bash
, obwohl der verwendete Interpreter ist /bin/bash
. Ich bin mir nicht sicher, warum Shell-Designer die Standard-Shell anstelle der aktuellen Shell angezeigt haben, aber das scheint das zu sein, woran wir festhalten.
Es gibt einige andere leicht ähnliche Fragen ( hier und hier ), aber ihre Antworten sind in vielerlei Hinsicht unzureichend.
- Sie gehen oft davon aus, dass der Benutzer versucht herauszufinden, welche interaktive Shell er derzeit verwendet, aber das ist verrückt. Ich weiß , was Shell Ich bin Typisierung Befehle in - I - Code benötigen , die überall ausgeführt werden könnte in der Lage sein zu bestimmen , welche Shell es verwendet wird .
- Sie geben oft verschiedene Dinge zum Ausprobieren - wieder, als ob Sie sich in der Befehlszeile befinden und nur herumspielen können, bis Sie erfahren, dass Sie Bash verwenden -, aber ich brauche eine einzige Sache, die in allen Kontexten zuverlässig ist.
- Sie geben oft Dinge, die aus Skripten völlig nutzlos sind, wie z
echo $0
. Das schlägt fehl, wie im obigen Skript gezeigt. (Ja, es funktioniert in einer interaktiven Shell-Befehlszeile, aber warum sollten Sie jemals nicht wissen, welche Shell Sie verwenden?) - Sie manchmal geben Befehle, die (in meinen begrenzten Tests) sind die richtigen Informationen, wie
ps -p $$
, aber nicht über Cross-Plattform, Cross-Shell kompatibel sed / awk - Befehle Rohr durchzukommen nur die Shell Namen und ignorieren die anderen Informationen , die kommen zusammen für die Fahrt. - Dazu gehören Dinge, die nur bei ein paar Muscheln funktionieren, wie
$BASH_VERSION
und$ZSH_VERSION
. Ich möchte so viele Muscheln wie möglich unterstützen, wie zum Beispielfish
,csh
,tcsh
.
Wie kann ich zuverlässig und genau erfassen jede aktuelle Shell? Ich suche nach etwas, das plattformübergreifend, in Skripten und für so viele Shells wie möglich und vernünftig funktioniert 1 .
UPDATE : Als ich diese Frage stellte, erwartete ich, dass in die Muscheln eine Einrichtung eingebaut war, um uns diese Informationen zu geben, was anscheinend nicht der Fall ist. Da es jetzt unvermeidlich erscheint, sich auf etwas außerhalb der Muscheln zu verlassen, sollte ich deutlicher machen, dass ich nach einer plattformübergreifenden Lösung frage (die, obwohl sie durch meine Einwände gegen andere Antworten oben impliziert wird, leicht zu übersehen sein könnte, wenn Sie sie nicht anziehen Lesen Sie die Frage nicht sorgfältig durch.
Update 2 Wenn noch jemand glaubt, dass dies ein Duplikat der Nur-Linux-Frage ist, weil Stéphanes Antwort nicht nur Linux ist, sind hier die Unterschiede zwischen dem, was ich verlange, und dem, was er bereitgestellt hat. (Beachten Sie, dass das, was er geschrieben hat, genial ist und ich nicht klopfe, aber es löst mein Problem nicht.)
- Ich bin auf der Suche nach etwas einfach und zuverlässig , dass
- kann zu jeder Skript- oder Funktionsdefinition (die von einem
.zshrc
oder.bash_profile
oder was auch immer bezogen wird) zum Verzweigen hinzugefügt werden . - Sie können sein Skript nicht als externes Dienstprogramm verwenden, das den Interpreternamen an das aufrufende Skript / die aufrufende Funktion übergibt, da es immer vom Standardinterpreter interpretiert wird und diesen zurückgibt. Dies macht es entweder schwierig oder unmöglich, es für meine Zwecke zu verwenden. Wenn es möglich ist, ist es immer noch sehr, sehr schwierig, und die Lösung dafür ist in der Antwort nicht angegeben. Deshalb hat er meine Frage nicht beantwortet, daher handelt es sich nicht um ein Duplikat.
Wenn Sie etwas sehen möchten, das funktioniert, schauen Sie sich ShellDetective auf GitHub an . Dies könnte es einfacher machen, die Unterschiede zwischen dem, was bereits in SE vorhanden ist, und dem, wonach diese Frage sucht, zu erkennen (und wurde tatsächlich geschrieben, um die Bedürfnisse dieser Frage zu befriedigen, die anderswo nicht erfüllt wurden).
(PS , wenn Sie kann nicht glauben , es ist ein Anwendungsfall für diese, stellen Funktionen , die in Quellen erhalten .zshrc
, .bash_profile
oder .profile
je nachdem , was Server verwendet wird und welche Schalen es zur Verfügung hat. Sie stammen sind , so dass sie keine Shebang - Zeile haben. Sie sind am nützlichsten, wenn sie in einer beliebigen Shell arbeiten können, aber manchmal müssen sie wissen, in welcher Shell sie sich befinden, um zu wissen, wie sie sich verhalten sollen.)
1 Es geht mir nicht um "Muscheln", die keine Muscheln im herkömmlichen Sinne des Wortes sind. Es geht mir nicht um eine Muschel, die ein Typ für sich selbst geschrieben hat. Ich beschäftige mich nur mit echten Shells , die tatsächlich in freier Wildbahn vorkommen und die möglicherweise jemand verwenden muss, wenn er sich bei einem Server anmeldet, auf dem er nicht einfach die gewünschten Shells installieren kann.
sh -c "…"
, und erledigen Sie dann den Großteil der Arbeit in der POSIX-Shell-Syntax.
fish
und verwende sie zum Ausführen Ihres Skripts. Möchten Sie fish
oder csh
?