Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Standard-Shell des aktuellen Benutzers in einem Shell-Skript herauszufinden.
Anwendungsfall: Ich arbeite an einem Skript, das einen Alias für einen Befehl festlegt, und dieser Alias wird in einem Shell-Skript festgelegt.
!# /bin/bash
alias = 'some command to set the alias'
Das Skript enthält eine Logik, die versucht, die Standard-Shell des Benutzers zu finden, der das Skript ausführt, und diesen Alias in die entsprechende Datei ~ / .bashrc oder ~ / .zshrc einfügt
Da ich jedoch einen Shebang im vorderen Bereich des Skripts hinzufüge und ihn explizit auffordere, bash zu verwenden, geben die hier veröffentlichten Antworten immer wie erwartet bash zurück, obwohl ich dieses Skript auf einem ZSH-Terminal ausführe.
Gibt es eine Möglichkeit, den Shell-Typ zu ermitteln, in dem das Skript ausgeführt wird, unabhängig vom Shebang-Set?
Ich suche nach einer Lösung, die sowohl auf dem Mac als auch im gesamten Linux-basierten Bistro funktioniert.
quelle
/etc/passwd
OSX? Ich habe einen kurzen Blick online geworfen und es scheint, dass die Shell da ist, nur nicht der Benutzername. Die Benutzer-ID ist immer noch da. Warum verwenden Sie das nicht?Antworten:
quelle
finger $USER | grep 'Shell:*' | cut -f3 -d ":"
unabhängig zu machen, da die grep-Optionen -P auf dem Mac nicht unterstützt werden.finger
möglicherweise nicht auf allen Computern installiert ist. Es ist ein optionales Paket auf RedHat-basierten Systemen.getent|grep ^$USER:|cut -f: -f7
anstelle von Finger verwenden, wenn Finger nicht standardmäßig installiert war.SHELL
Umgebungsvariable, falls vorhanden. Wenn Sie sich die Benutzerdatenbank ansehen, erhalten Sie ein Ergebnis (die Anmeldeshell des Benutzers), aber es ist möglicherweise nicht das richtige Ergebnis (die bevorzugte interaktive Shell des Benutzers) - dies hängt von der Konfiguration des Benutzers ab.Die Umgebungsvariable wird
SHELL
immer auf die Standard-Anmeldeshell des aufrufenden Benutzers erweitert (erhält den Wert von/etc/passwd
).Für jeden anderen Benutzer, mit dem Sie etwas verarbeiten müssen
/etc/passwd
, ist hier ein einfacherawk
Ausschnitt:Ersetzen Sie
foobar
durch den tatsächlichen Benutzernamen.Wenn Sie
ldap
(oder etwas Ähnliches) haben, verwenden Siegetent
, um die Datenbank abzurufen, anstatt sie direkt zu analysieren/etc/passwd
:oder am saubersten Ansatz, lassen
getent
Sie die Analyse durchführen (dank @Kusalananda):quelle
getent passwd foobar
um zu überspringen, dass eine bestimmte Zeile übereinstimmen muss.Da dies unter
getent
MacOS kein Standardbefehl ist, möchten Sie möglicherweise einengetpwuid
Anruf auf niedrigerer Ebene verwenden , der die Namensdienste konsultiert, für die der Computer konfiguriert ist. Dies erfordert möglicherweise das Aufrufen vonperl
oderpython
, was auf den meisten Unix-ähnlichen Plattformen häufig vorkommtDies gibt beispielsweise die Shell für den aktuellen Benutzer zurück:
quelle
Sie können die Standard-Shell des Benutzers wie folgt aus der Umgebung abrufen:
Aber nicht so:
Letzteres sagt Ihnen nur, welche Shell Ihr Skript gerade verwendet. Sie möchten also die erste Option oben.
quelle
Kurz und schmerzlos:
quelle
Vielleicht das:
quelle
USER=fred
dann dieses Spielfred
,frederick
,alfred
,alfredo
...