2013-05-04 25 views
15

Wir können etwas wie chsh -s /usr/local/bin/zsh ausführen, um eine neue Standardshell festzulegen. Gibt es einen Befehl, den wir ausführen können, um zu wissen, was diese Shell ist?So erhalten Sie die Standardshell

Ich meine nicht, ein Terminal öffnen und einen Befehl ausführen, um zu wissen, in welcher Shell wir sind, ich meine wie im obigen Beispiel, wenn ich in einem Terminal mit /bin/bash offen bin, was soll ich ausführen get /usr/local/bin/zsh, wenn es die aktuelle Standard-Shell ist?

+1

möglich Duplikat [Wie die aktuell Shell zu bestimmen, auf ich arbeite?] (http: // Stackoverflow. com/questions/3327013/how-to-bestimmen-the-current-shell-im-arbeiten-on) – TheHippo

+0

Denken Sie auch an die Existenz e von http://unix.stackexchange.com/ :) –

+1

Nein, das ist die * aktuelle * Shell und nicht die * Standard * Shell des Benutzers. – zwol

Antwort

27

können Sie den folgenden Befehl verwenden echo $SHELL

+2

Beachten Sie, dass 'SHELL' nicht von allen Shells gesetzt werden kann, und es gibt keine Garantie, dass alle Shells die gleichen Regeln verwenden, um ihren Wert festzulegen. – chepner

+3

@chepner Die Shell Variable ist etwas Standard. Es wird nicht von der Shell selbst festgelegt, sondern bevor die Shell durch den Anmeldevorgang gestartet wird. – jlliagre

+1

@jilliagre: Ich habe im Abschnitt "Shells & Utilities" des Standards nachgesehen, nicht bei den Basisdefinitionen. "SHELL" ist tatsächlich in Abschnitt 8.3 des Kapitels [Umgebungsvariablen] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html) der Basisdefinitionen definiert. – chepner

1

Wenn Sie die Standard-Shell eines Benutzers erhalten möchten, können Sie die /etc/passwd grep. wie:

kent$ grep "$USER" /etc/passwd 
kent:x:1000:1000::/home/kent:/bin/zsh 

mir zu sagen, dass der aktuelle Benutzer (Kent) Standard-Shell /bin/zsh

wenn Sie die Shell will nur Teil fangen hat:

kent$  awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd 
/bin/zsh 

Wenn Sie den Standard erhalten möchten Shell eines anderen Benutzers, ersetzen Sie einfach den $ USER-Teil.

+0

Warum machen alle die harte Arbeit? Just do 'echo $ SHELL' – Bill

+0

ja $ SHELL ist die Abkürzung zum aktuellen Benutzer. – Kent

+1

Scheint nicht unter OSX zu funktionieren. – user137369

2

Sie in der Datei/etc/passwd-Datei für aktuelle Benutzername grep können, und schneiden Sie die entsprechende Spalte von Informationen zu extrahieren:

grep ^$(id -un): /etc/passwd | cut -d : -f 7- 

$(id -un) sind ein sicherer als $USER, um den Benutzernamen zu erhalten. Die Verwendung von ^ vor dem Benutzernamen und : nach stellt sicher, dass Sie keine falsche Übereinstimmung erhalten, wenn Ihr Benutzername ein Unterabschnitt eines anderen Benutzernamens ist.

$SHELL kann auch verwendet werden, wie vorgeschlagen. Es wird jedoch nicht funktionieren, wenn chsh in der aktuellen Shell verwendet wurde, da die Variable nicht aktualisiert wird. Auch ist die Variable nicht gegen Änderungen geschützt, so dass sie theoretisch auf etwas ganz anderes gesetzt werden kann.

Aktualisieren, um eine OS X-kompatible Lösung zu versuchen. Wahrscheinlich nicht optimal regexp:

grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7- 

Dies basiert auf Benutzer-IDs. Wenn der gesamte Benutzereintrag fehlt, nicht nur der Benutzername, muss osx dies an anderer Stelle speichern.

+0

Scheint nicht unter OSX zu funktionieren. – user137369

+0

Welcher Teil funktioniert nicht auf OSX? Greifen Sie auf/etc/passwd zu, um die Standard-Shell oder das Zeug zu erhalten, um den Benutzernamen und den gewünschten Teil der Informationen zu extrahieren? – Atle

+0

Aus irgendeinem Grund ist der Name meines Benutzerkontos nicht in '/ etc/passwd' enthalten. – user137369

-1

In OS X, mit dem Befehl env | grep -i 'SHELL' erzeugt eine Ausgabe, wie beispielsweise: SHELL=/bin/sh (root, neigen jedoch normale Benutzer haben/ist/bash als Standard-Shell) mit einem kleinen Parsing, der Pfad der Schal (und somit die Shell selbst) leicht von dort ..

4

für macOS identifiziert und extrahiert werden konnte

dscl . -read /Users/username UserShell 
+0

Ich bin auf macOS. Obwohl Ihr Code auch funktioniert, ist echo $ SHELL in jeder Hinsicht überlegen. Es ist schneller zu laufen, benötigt weniger CPU, ist kürzer und vielseitiger. – user137369

+2

@ user137369 Wenn Sie 'chsh' aus einer Shell aufrufen, kann '$ SHELL' nicht aktualisiert werden. Also meldet 'echo $ SHELL' den alten, jetzt falschen Wert, aber 'dscl. -read/Benutzer/$ USER UserShell' meldet den neuen Wert. –