Ändern Sie die Standard-Shell unter MSYS2

14

Ich möchte MSYS2 die Standard - Shell von Änderungen bashzu zsh.

Ich habe versucht chsh- nicht in MSYS2 verfügbar.
Bearbeiten /etc/passwdmacht nichts. Es scheint ignoriert zu werden.

Ich nahm einen Blick auf die Batch - Skripten in MSYS2 Stammverzeichnis, und bashist fest einprogrammiert. Ich änderte jeden /usr/bin/bashzu /usr/bin/zsh, was gut funktioniert, bis ich mit MinGW versucht.

Wo kann ich die Shell von MSYS2 (richtig) ändern, wenn dies überhaupt möglich ist?

Sorbet
quelle

Antworten:

8

Ich bin gerade auf dieses Problem gestoßen. Um zsh zum Laufen zu bringen, habe ich Folgendes getan:

  • Installiertes MSYS2
  • Aus dem Verzeichnis, in dem ich MSYS2 installiert habe, habe ich ausgeführt mingw32_shell.bat
  • Aktualisierte alle installierten Pakete durch Ausführen pacman -Syu
  • Installierte zsh und curl durch Ausführen pacman -Sy zsh curl
  • Die MinGW-Shell wurde durch Ausführen geschlossen exit- ich wurde nicht zshsofort nach der Installation ausgeführt.
  • Msys2_shell.bat, mingw32_shell.bat und mingw64_shell.bat wurden bearbeitet und jede Instanz von: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* in: geändert start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (in Zeile 39 vom 23.09.2015)
  • Ran mingw32_shell.bat
  • Im zsh-Konfigurationsmenü wähle ich aus, 0um die .zshrc-Datei zu erstellen.

Als die Konfiguration abgeschlossen war, sah ich:

zsh-newuser-install:1119: command not found: rm

Was nicht richtig aussah ... da rmes auf einem gesunden * nix-System niemals net zu finden sein sollte (ich vermute, es ist ein Fehler mit dem zsh-Paket von MSYS2), aber danach lief alles gut.

Als ich dies zum ersten Mal versuchte, als ich eine Batchdatei öffnete, um eine neue Sitzung zu erstellen, erhielt ich eine Fehlermeldung, dass der Speicherplatz von zsh bereits belegt ist. Um dies zu beheben, habe ich alle geöffneten MinTTY-Fenster geschlossen und die autorebase.batDatei im MSYS2-Installationsverzeichnis ausgeführt. Danach hat alles geklappt.

Dann habe ich oh-my-zsh installiert. Verwenden von:

sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Livingstaccato
quelle
Ich habe versucht, diese Methode im Grunde zu machen, und ich konnte Fische nicht ohne Fehler zum Arbeiten bringen.
leetNightshade
1
Das rmist eigentlich wirklich unschuldig. Das Ende des /usr/share/zsh/functions/Newuser/zsh-newuser-installSkripts enthält ein rm -f $tmpfile*, um nach sich selbst aufzuräumen. Es ist genau das gleiche in der aktuellen Fedora-Installation /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD
24

Ich bin darauf mit dem neueren msys2-Launcher gestoßen, der Starter .exeanstelle von Batch-Dateien bereitstellt .

Dazu war es nur eine Frage der den sich ändernden .iniDateien neben den Trägerraketen innerhalb des Msys2 Stammverzeichnis (für eine 64-Bit - Installation kann es enthalten msys2.ini, mingw32.iniund mingw64.ini). Fügen Sie für jede dieser INI-Dateien eine Zeile hinzu, um die Shell festzulegen:

SHELL=/usr/bin/zsh
Alan Pearce
quelle
Dies ist der direkte Weg, um zshals Shell festzulegen. Zum Einrichten von oh-my-zsh könnte man diese Methode in Betracht ziehen - der skelTeil gilt meines Erachtens nicht wirklich für msys2.
TNT
1
Dies ist die richtige Antwort für neuere msys2 ab Juli 2018. Die akzeptierte Antwort funktioniert nicht mehr.
GaryO
funktioniert nicht mehr (14.03.19)
letroll
5

Bearbeiten /etc/nsswitch.confund ändern Sie die Einstellung unten:

db_shell: /bin/zsh
Das Nilpferd
quelle
Dies funktioniert, scheint aber eine ziemlich hackige Version von Alan Pearces Lösung zu sein.
TNT
Ich konnte das nicht zum Laufen bringen, wenn ich versuchte, Fisch zu verwenden.
leetNightshade
Ich habe diese Antwort auch hier gefunden: github.com/elieux/msys2-launcher/issues/…, aber Alan Pearces Antwort scheint besser zu sein. Beides funktioniert zwar, und Sie können die Shell auch in der msys2_shell.cmdBat-Datei festlegen , aber das Ändern in der .cmdDatei wirkt sich nicht auf die Shell aus, wenn Sie von einem der .exes
Jose
4

Wenn das Ändern der Standard-Shell nicht unterstützt wird, können Sie die gewünschte Shell verwenden, indem Sie sie sofort starten, wenn die Standard-Shell gestartet wird.

Schreiben Sie zshzum Beispiel einfach an ~/.bashrcund wenn bash startet, wird zsh für Sie ausgeführt. Wie auch immer, ein streunender Bash-Prozess läuft noch und Sie müssen die Shell beim Abmelden zweimal beenden. Um es besser zu machen, schreiben Sie exec zshstatt auf zshdiese Weise wird der Bash-Prozess vollständig durch einen zsh-Prozess ersetzt.

Diese Methode ist nicht perfekt, sollte aber in den meisten Fällen gut funktionieren. Im Vergleich zum Ändern fest codierter Werte kann dies zu weniger Kompatibilitätsproblemen führen.

Es wird zuerst in dieser Antwort auf StackOverflow erwähnt .

wzhd
quelle
Nichts Nettes oder Besonderes daran, aber es funktioniert mit dem geringsten Aufwand.
leetNightshade
3

Mein installiert hat nicht haben , die genannten Dateien in der akzeptierten Antwort ( msys2_shell.bat, mingw32_shell.bat, und mingw64_shell.bat).

Stattdessen enthält meine Win10-Systeminstallation von MSYS2 (unter Verwendung der Installationsdatei msys2-x86_64-20161025.exe) eine einzelne Datei msys2_shell.cmdmit der Zeile:

set "LOGINSHELL=bash"

Ich wechselte bashzu zsh. Scheint soweit zu funktionieren.

xtian
quelle
Ihre Lösung hat unter Win7 bei mir nicht funktioniert. Haben Sie danach noch andere Dinge getan?
Letroll
1
Entschuldigung, ich habe keine weiteren Informationen. Ich wechselte zur WSL, die für meine Bedürfnisse funktioniert. Viel Glück.
Xtian
Das hat bei Win10 funktioniert
Jose
Wenn Sie jedoch msys2 von einer der .exeDateien aus starten müssen, wird die Shell dadurch nicht festgelegt. Schauen Sie sich dazu die Antwort von Alan Pearce an
Jose
1

Ich habe eine Lösung, aber es erfordert, dass Sie ConEmu anstelle des anderen Terminals verwenden, das Sie derzeit verwenden. Probieren Sie es aus, meiner Meinung nach ist es die beste Terminal-App unter Windows.

Zunächst müssen Sie zsh mit pacman installieren. Ich denke, du bist schon so weit gekommen. Dann müssen Sie ConEmu installieren (was Sie mit Chocolatey tun können oder indem Sie einfach das Installationsprogramm von der conemu-Site herunterladen). In den ConEmu-Einstellungen sollten Sie unter "Aufgaben" eine neue Aufgabe hinzufügen. Es hat wahrscheinlich schon einen Anruf Bash::Msys2-64oder so etwas, also machst du vielleicht einen Anruf Zsh::Msys2-64. Der Name ist in jedem Fall beliebig. Im Feld 'Befehle' für diese neue Aufgabe können Sie den Befehl grundsätzlich kopieren Bash::Msys2-64und zsh.exegegebenenfalls ersetzen . Meins ist wie:

set CHERE_INVOKING=1 & %ConEmuDrive%\msys64\usr\bin\zsh.exe --login -i -new_console:C:"%ConEmuDrive%\msys64\msys2.ico"

In den Startoptionen von ConEmu können Sie dies als Startaufgabe festlegen, sodass Sie beim Öffnen von ConEmu jedes Mal direkt in Ihr Zsh gelangen. Natürlich können Sie auch eine Tastenkombination zum Öffnen oder eine andere Aufgabe in einem neuen Tab oder nach Belieben festlegen. ConEmu bietet eine Vielzahl von Optionen, sodass Sie es sicher nach Belieben einrichten können.

Okonomiyaki3000
quelle
0

Die MSYS2-Entwickler ändern offensichtlich ständig ihr Setup, da bei den neuesten Installationen der msys2_shellin Windows installierte Befehl zum Starten der MSYS2-Umgebung (en) ein -shellArgument akzeptiert .

Um eine andere Shell zu verwenden, können Sie die Eigenschaften eines oder mehrerer Starter für MSYS2 / MinGW 32 / MinGW 64 bearbeiten und das Ziel aktualisieren, um es hinzuzufügen -shell zshoder was auch immer. (Wenn die Shell $PATHfür die MSYS-Umgebung geeignet ist, die ausreicht, benötigen Sie nicht den vollständigen Pfad.)

Zum Beispiel für den Launcher "MSYS2 MinGW 64-Bit" in "MSYS2 64bit" in meinem Win7-Startmenü:

Vor
Ziel: C:\msys64\msys2_shell.cmd -mingw64
Nach
Ziel: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

Dies scheint die einfachste und kompatibelste Möglichkeit zu sein, dauerhaft zu wechseln, da Ihre Änderungen nicht durch Upgrades oder was auch immer gelöscht werden.

Seltsamerweise berücksichtigen die Starter keine Umgebungsvariablen, Registrierungseinträge usw. Sofern -shelldie Befehlszeile nicht zum Überschreiben übergeben wird, wird die LOGINSHELL=bashStandardeinstellung verwendet, die sie ursprünglich erzwingt.

FeRD
quelle
0

BEARBEITEN: Das Folgende gilt für frühere Versionen von MSYS2. Ab dem 21.01.2020 ist es nicht mehr erforderlich. Die Antwort von FeRD scheint am besten zu funktionieren.

Ich wollte Fisch anstelle von Bash verwenden. Leider haben die meisten Methoden hier nicht funktioniert, möglicherweise weil die Fischsyntax so unterschiedlich ist.

Was am besten funktionierte, war die Idee von wzhd, exec fishals erstes zu laufen , wenn die Bash beginnt. Es gab jedoch immer noch ein Problem: Wenn ich bash verwenden wollte, musste ich bearbeiten .bashrc, um diese Zeile zu entfernen, da selbst wenn ich sie von fish aus laufen lasse, nur eine andere Fischinstanz gestartet wird.

Am besten stellen Sie sicher, dass es ausgeführt wird, exec fishwenn msys2 beginnt, aber nicht jedes Mal , wenn bash beginnt.

Ich habe die Datei msys2_shell.cmdim Installationsordner von msys2 gefunden. Ich habe diese Zeilen gefunden:

set SHELL_ARGS=

:collectparams

if not "x%~1" == "x" set SHELL_ARGS=%SHELL_ARGS% %1& shift& goto :collectparams

Es scheint, dass sie Parameter definieren, die an bash übergeben werden sollen, sobald es beginnt, aber nur, wenn dieses Skript ausgeführt wird (im Gegensatz zu .bashrc). Also habe ich diese Zeile gleich danach hinzugefügt:

set SHELL_ARGS=%SHELL_ARGS% -c "exec fish"

Bisher scheint alles in Ordnung zu sein. Das Starten von msys2 ersetzt bash durch fish, sobald der Ladevorgang abgeschlossen ist. Wenn ich jedoch eine bash-Befehlszeile benötige, kann ich sie trotzdem einfach starten bash.

George T.
quelle