Ich benutze die Computer meiner Schule und möchte zsh
stattdessen verwenden bash
. Ich würde es gerne zur Standard-Shell machen, aber ich kann keinen Befehl ausführen, $ chsh -s $(which zsh)
weil ich keine Administratorrechte habe.
Gibt es eine Möglichkeit, wie ich etwas in mein .bashrc
einfügen kann oder etwas, das automatisch aufgerufen wird, zsh
wenn es als Workaround geöffnet wird?
Zur Verdeutlichung zsh
ist bereits installiert.
zsh
die.bashrc
Datei hinzu. Abmelden und einloggen und fertig!zsh
die erste Zeile gesetzt?bash
es explizit aufgerufen wird. Legen Sie es.bash_profile
stattdessen lieber ein.Antworten:
Erstellen Sie
.bash_profile
in Ihrem Home-Verzeichnis die folgenden Zeilen:Update:
.profile
funktioniert möglicherweise als allgemeine Lösung, wenn die Standard-Shell nicht bash ist. Ich bin mir nicht sicher, ob.profile
Zsh auch aufruft, dass es überflüssig werden könnte, aber wir können es mit einer einfachen Überprüfung sicher tun:Wir können auch verwenden
which
, um den dynamischen Pfad zu ermitteln,zsh
der sich auf folgenden Wert stützt$PATH
:quelle
.bash_profile
wird nicht verwiesen. Wie wäre es, wenn Sie dies.profile
stattdessen einfügen?.profile
hat nicht funktioniert. Auch würde nicht.profile
von angerufen werdenZsh
? Es könnte überflüssig werden. Hab das aber noch nicht überprüft. (Update: Es hat jetzt funktioniert, ich bin mir nicht sicher, welchen Fehler ich gemacht habe.) Haben Sie Gedanken über mögliche Nachteile bei der Verwendung.profile
?.profile
wenn es.bash_profile
diese nicht gibt (es sei denn, Sie beziehen sie manuell.bash_profile
von). Insbesondere bash Quellen die erste der Dateien [.bash_profile
>.bash_login
>.profile
] es findet. Es wird nur nach.profile
einer POSIX-Kompatibilitätsfunktion (Bourne-Shell) gesucht.zsh
..bash_profile
und.profile
hat nicht funktioniert (die Dateien wurden nicht einmal ausgeführt, Fedora 26 auf einem Universitätscomputer).Normalerweise können Sie
chsh
als Nicht-Root-Benutzer verwenden. Es ist jedoch gelegentlich deaktiviert, in der Regel auf Websites, auf denen eine Art vernetzte Benutzerdatenbank wie NIS und LDAP verwendet wird. Möglicherweise gibt es stattdessen einenypchsh
(NIS) oder einenchsh.ldap
(LDAP).chsh
In der Regel sind auch nur einige zugelassene Shells zulässig , in der Regel die in aufgeführten/etc/shells
.Wenn Sie
chsh
oder seine Varianten auf Ihrer Site nicht verwenden können , ordnen Sie Ihre Anmeldeshellexec
Ihrer Lieblingsshell zu und legen Sie dieSHELL
Variable so fest, dass sie auf Ihre Lieblingsshell verweist.Wenn Ihre Login - Shell ist
sh
,dash
oderksh
: die Datei müssen Sie bearbeiten ist~/.profile
. Beachten Sie, dass diese Datei zu Beginn einer interaktiven Sitzung sowie von einigen nicht interaktiven Sitzungsstartskripten (z. B. für X11-Sitzungen) gelesen wird. Sie müssen also darauf achten, dass Sie nur dann aufrufenexec
(was den aktuellen Prozess ersetzt), wenn der aktuelle Shell ist interaktiv. Mit Ausnahme der Bourne-Shell (die/bin/sh
von Solaris 10 und früher) können Sie anhand des Vorhandenseins voni
in der Optionsliste ($-
) erkennen, dass eine Shell interaktiv ist .Wenn Sie möchten, dass zsh Ihre liest
.zprofile
, übergeben Sie die-l
Option.Wenn Ihre Login-Shell ist
bash
, können Sie wie oben vorgehen. Alternativ können Sie diese Befehle eingeben~/.bash_profile
. Die meisten Sitzungsstartskripte lesen nur~/.profile
und nicht~/.bash_profile
, aber ich habe einige gesehen, die unter Bash und Read laufen.bash_profile
, daher sollten Sie auch dort darauf achten, keineexec
nicht interaktive Shell aufzurufen .Wenn Ihre Anmeldeshell csh oder tcsh ist, lesen Sie ein Beispiel unter Ändern der Standardshell ohne chsh- oder Administratorberechtigungen
quelle
Ich glaube, der Befehl
chsh
dient genau diesem Zweck. Ich bin mir allerdings nicht sicher, ob jede Linux / Unix-Distribution dies unterstützt. Überprüfen Sie die Manpage vonchsh
.quelle
passwd -s
.Wenn Sie nicht laufen können,
chsh
weil Sie keine Administratorrechte haben, sprechen Sie mit jemandem, der dies tut .Höchstwahrscheinlich können Sie nicht
chsh
als Nicht-Root-Benutzer verwendet werden, da das von Ihnen verwendete System so konfiguriert ist, dasschsh
es nicht funktioniert, z. B. weil das System NIS oder LDAP anstelle nur der/etc/passwd
Datei verwendet. Oder vielleicht möchte der Administrator Ihres Systems nur die Kontrolle behalten.Das Verfahren zum Ändern Ihrer Shell hängt von den Richtlinien Ihrer Organisation ab. Möglicherweise gibt es einen lokalen Befehl, der die
chsh
normalen Funktionen ausführt. Oder Sie müssen möglicherweise ein Support-Ticket einreichen, um eine Shell-Änderung anzufordern.Die meisten anderen Antworten sind gut, aber wenn Ihre Administratoren angemessen reagieren, sollten Sie sich nicht die Mühe machen, Ihre Startskripte zu hacken. Ich würde wahrscheinlich nur
zsh -l
manuell aufrufen, nachdem ich mich angemeldet habe, bis der Administrator mein Konto aktualisiert hat.Eine andere Sache, die Sie beachten sollten: Manchmal können verschiedene Shells die gleichen Startdateien verwenden. Zum Beispiel,
sh
undbash
beide ausführen kann$HOME/.profile
, undcsh
undtcsh
kann sowohl ausführen$HOME/.login
und$HOME/.cshrc
(obwohl Shell spezifische Startdateien wie.bashrc
,.bash_profile
und.tcshrc
diejenigen außer Kraft setzen kann). Wenn Ihre Standard-Shell ist/bin/csh
und Sie verwenden möchten,/bin/tcsh
kann das Aktualisieren von.login
to invoke/bin/tcsh -l
eine Endlosschleife erzeugen.zsh
führt nicht zufälligbash
-spezifische Startdateien aus, daher ist dies für Sie kein Problem.Die meisten Schalen setzen Variablen , die identifizieren , die Sie laufen Shell (
$BASH_VERSION
,$tcsh
,$ZSH_VERSION
). Wenn Sie Startcode schreiben, um Ihre bevorzugte Shell aufzurufen, ist es keine schlechte Idee, ihn in ein einzuschließen,if
sodass er nur ausgeführt wird, wenn Sie diese Shell nicht bereits ausführen. Verwenden Sie den Code aus der Antwort von konsolebox :(Die zusätzliche Komplikation des Überprüfens,
"${ZSH_VERSION:-unset}"
anstatt nur"$ZSH_VERSION"
die Möglichkeit zu berücksichtigen, die Sie gemacht habenset -o unset
, ist eine Option, die bewirkt, dass ein Verweis auf eine undefinierte Variable ein Fehler ist.)quelle
Ich kann mir einige Szenarien vorstellen.
zsh
ist nicht in/etc/shells
, und das OP möchte es verwenden, ohnezsh
an der Eingabeaufforderung eingeben zu müssen. Mögliche Lösungen.a) Verwenden Sie Profiltricks, um es beim Anmelden auszuführen. Dies ist genauso effektiv wie das eigentliche Ändern der Shell.
b) bitten den Admin hinzuzufügen ,
zsh
um/etc/shells
so können Siechsh
es zuc) Bitten Sie den Administrator, Ihre Shell zu ändern. Dies ist nicht klug, weil Sie dadurch die Fähigkeit verlieren, einzusteigen
ftp
. Sie können es nur verwenden,ftp
wenn Sie eine Shell haben/etc/shells
Benutzer möchte eine eingeschränkte Shell am ehesten entkommen
rbash
oderrsh
.Wenn
.profile
es bearbeitbar ist,PATH
kann es durch Bearbeiten erweitert werden. Sobald Sie/bin
sich im Pfad befinden, können Siebash
von innen beginnenrsh/rbash
und auf denchsh
Befehl zugreifen, mit dem Sie die Muscheln wechseln können. Viele Befehle verfügen über Shell-Escape-Befehle, mit denen Sie eine eingeschränkte Shell verlassen und wieder auf diese zugreifen könnenchsh
.chsh
funktioniert aus irgendeinem anderen Grund nicht. Lösung a von Möglichkeit 1 ist auch hier eine Antwort.Szenario 2 ist der einzige Grund, die Standard-Shell tatsächlich zu ändern (sie ist zu restriktiv).
quelle
Ich denke nicht, dass die angegebene Antwort tatsächlich
zsh
die Standard-Shell macht. Es ändert einfach die Shell in zsh, sobald sich der Benutzer bei seiner Standard-Shell anmeldet . Der Benutzer wird sich weiterhin bei its anmelden,DEFAULT SHELL
aber damit ändert sich die Shell zuzsh
So ändern Sie die Standardshell:
Sie sollten root sein, um das zu tun.
Andernfalls ist die oben beschriebene Problemumgehung hilfreich.
Aus Kommentar hinzugefügt
und es kann vom Benutzer für sich selbst aufgerufen werden.
quelle
chsh -s /path/to/zsh
ist standardmäßiger und erfordert normalerweise (aber nicht immer) keinen Root-Zugriff, anders alsusermod
dies immer der Fall ist. Ihre Antwort weist also mehr Probleme auf, als in der Frage bereits als nicht funktionierend angegeben ist.