Zmień domyślną powłokę na MSYS2

14

Chcę zmienić domyślną powłokę MSYS2 z bashna zsh.

Próbowałem chsh- niedostępne w MSYS2.
Edycja /etc/passwdnic nie robi. Wydaje się być ignorowany.

Rzuciłem okiem na skrypty wsadowe w katalogu głównym MSYS2 i jestem na stałe zapisany bash. Zmieniłem każdy /usr/bin/bashna /usr/bin/zsh, który działał dobrze, dopóki nie spróbowałem użyć MinGW.

Gdzie mogę zmienić powłokę MSYS2 (poprawnie), jeśli to w ogóle możliwe?

sorbet
źródło

Odpowiedzi:

8

Właśnie natrafiłem na ten problem. Aby uruchomić Zsh, zrobiłem to:

  • Zainstalowano MSYS2
  • Z katalogu, w którym zainstalowałem MSYS2, uruchomiłem mingw32_shell.bat
  • Uaktualniono wszystkie zainstalowane pakiety, uruchamiając pacman -Syu
  • Zainstalowano Zsh i curl, uruchamiając pacman -Sy zsh curl
  • Zamknąłem powłokę MinGW, uruchamiając exit- nie uruchomiłem zshnatychmiast po instalacji.
  • Edytowałem msys2_shell.bat, mingw32_shell.bat i mingw64_shell.bat i zmieniłem każde wystąpienie: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* na: start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (w linii 39 na dzień 23.09.2015)
  • Biegł mingw32_shell.bat
  • W menu konfiguracji zsh wybieram 0utworzenie pliku .zshrc.

Po zakończeniu konfiguracji zobaczyłem:

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

Co nie wyglądało dobrze ... ponieważ rmnigdy nie powinno się znaleźć w zdrowym systemie * nix (zgaduję, że to błąd w pakiecie zsh MSYS2), ale potem wszystko poszło dobrze.

Kiedy po raz pierwszy spróbowałem tego, kiedy uruchomiłem, otworzyłem plik wsadowy, aby utworzyć nową sesję, otrzymałem błąd dotyczący zajętej przestrzeni pamięci zsh. Aby to naprawić, zamknąłem wszystkie otwarte okna MinTTY i uruchomiłem autorebase.batplik w katalogu instalacyjnym MSYS2. Potem wszystko działało.

Potem zainstalowałem oh-my-zsh. Za pomocą:

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

livingstaccato
źródło
Próbowałem zrobić w zasadzie tę metodę i nie mogłem zmusić ryb do pracy bez błędu.
leetNightshade
1
To rmjest naprawdę naprawdę niewinne. Koniec /usr/share/zsh/functions/Newuser/zsh-newuser-installskryptu zawiera rm -f $tmpfile*po sobie opcję czyszczenia. Jest dokładnie tak samo w bieżącej instalacji mojej Fedory /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD
24

Natknąłem się na to przy użyciu nowszego programu uruchamiającego msys2, który zapewnia programy uruchamiające, .exea nie pliki wsadowe.

Do tego, to było po prostu kwestia zmiany .iniplików obok wyrzutni wewnątrz katalogu Msys2 (dla instalacji 64-bitowej, może ona zawierać msys2.ini, mingw32.inii mingw64.ini). Dla każdego z tych plików ini dodaj wiersz, aby ustawić powłokę:

SHELL=/usr/bin/zsh
Alan Pearce
źródło
Jest to bezpośredni sposób ustawienia zshpowłoki. Przy ustawianiu oh-my-zsh można rozważyć tę metodę - ta skelczęść tak naprawdę nie dotyczy msys2, o ile widzę.
TNT
1
To jest poprawna odpowiedź dla nowszej wersji msys2 od lipca 2018 r. Akceptowana odpowiedź już nie działa.
GaryO,
już nie działa (
14.03.19
5

Edytuj /etc/nsswitch.confi zmień poniższe ustawienie:

db_shell: /bin/zsh
Teh Hippo
źródło
To działa, ale wydaje się raczej hackerską wersją rozwiązania Alana Pearce'a.
TNT
Nie mogłem tego uruchomić, próbując używać ryb.
leetNightshade
Tutaj też znalazłem tę odpowiedź: github.com/elieux/msys2-launcher/issues/... ale odpowiedź Alana Pearce'a wydaje się ładniejsza. Obie prace, choć i można również ustawić powłokę wewnątrz msys2_shell.cmdpliku bat, ale zmieniając go w .cmdpliku nie ma wpływu na powłokę jeśli trzeba zacząć od jednego z .exeS
Jose
4

Gdy zmiana domyślnej powłoki nie jest obsługiwana, jednym ze sposobów użycia powłoki, którą lubisz, jest uruchomienie jej natychmiast po uruchomieniu domyślnej powłoki.

Na przykład, po prostu napisz zshdo ~/.bashrc, a kiedy bash się rozpocznie, uruchomi dla ciebie zsh. Jak zawsze działa proces bezpańskiego basha, a wylogowanie wymaga dwukrotnego opuszczenia powłoki. Aby było lepiej, pisz exec zshzamiast w zshten sposób proces bash jest całkowicie zastąpiony procesem zsh.

Ta metoda nie jest idealna, ale w większości przypadków powinna działać dobrze. W porównaniu do zmiany wartości zakodowanych na stałe może powodować mniej problemów ze zgodnością.

Po raz pierwszy wspomniano w tej odpowiedzi na StackOverflow .

wzhd
źródło
Nie ma w tym nic fajnego ani wyszukanego, ale działa to z najmniejszym zamieszaniem.
leetNightshade
3

Moja instalacja nie nie mają wspomnianych plików odpowiedź dozwolone ( msys2_shell.bat, mingw32_shell.bat, i mingw64_shell.bat).

Zamiast tego moja instalacja MSYS2 w systemie Win10 (przy użyciu pliku instalatora msys2-x86_64-20161025.exe) ma jeden plik msys2_shell.cmdz linią:

set "LOGINSHELL=bash"

Zmieniłem się bashna zsh. Wydaje się, że do tej pory działał.

Xtian
źródło
Twoje rozwiązanie nie działało dla mnie na Win7. Czy robisz potem inne rzeczy?
letroll
1
Przepraszam, nie mam żadnych dalszych informacji. Przeszedłem do WSL, który działa na moje potrzeby. Powodzenia.
xtian
to zadziałało dla mnie na Win10
Jose
jednak jeśli musisz uruchomić msys2 z jednego z .exeplików, to nie ustawi powłoki, bo to spojrzenie na odpowiedź Alana Pearce'a
Jose
1

Mam rozwiązanie, ale wymaga użycia ConEmu zamiast jakiegokolwiek innego terminala, którego obecnie używasz. Spróbuj jednak, moim zdaniem, jest to najlepsza aplikacja terminalowa na Windows.

Przede wszystkim musisz zainstalować Zsh za pomocą Pacmana. Chyba już zaszedłeś tak daleko. Następnie musisz zainstalować ConEmu (co możesz zrobić z Chocolatey lub po prostu pobierając instalator ze strony conemu). W ustawieniach ConEmu, w sekcji „Zadania”, należy dodać nowe zadanie. Prawdopodobnie ma już jeden zwany Bash::Msys2-64lub coś w tym rodzaju, więc może zrobisz taki Zsh::Msys2-64. W każdym razie nazwa jest dowolna. W polu „Polecenia” dla tego nowego zadania możesz w zasadzie skopiować polecenie z Bash::Msys2-64i w zsh.exerazie potrzeby zastąpić je . Mój jest jak:

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

Następnie, w opcjach „Uruchamiania” ConEmu, możesz ustawić to jako zadanie uruchamiania, aby otwarcie ConEmu za każdym razem doprowadzało cię bezpośrednio do Zsh. Oczywiście możesz również ustawić kombinację klawiszy do otwierania go lub dowolnego innego zadania w nowej karcie lub cokolwiek chcesz. ConEmu ma wiele opcji, więc jestem pewien, że będziesz w stanie skonfigurować go tak, jak chcesz.

Okonomiyaki3000
źródło
0

Deweloperzy MSYS2 oczywiście zmieniają konfigurację, ponieważ w najnowszych instalacjach msys2_shellpolecenie zainstalowane w systemie Windows w celu uruchomienia środowiska MSYS2 akceptuje -shellargument.

Tak więc, aby użyć innej powłoki, możesz edytować właściwości jednego lub więcej programów uruchamiających MSYS2 / MinGW 32 / MinGW 64 i zaktualizować Cel, aby dodać -shell zshlub cokolwiek. (Jeśli powłoka jest $PATHwystarczająca dla środowiska MSYS, nie potrzebujesz pełnej ścieżki).

Na przykład dla programu uruchamiającego „MSYS2 MinGW 64-bit” w „MSYS2 64bit” w moim menu Start Win7:

Przed
Cel: C:\msys64\msys2_shell.cmd -mingw64
Po
Cel: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

To wydaje się być najłatwiejszym i najbardziej zgodnym sposobem na stałe przełączenie, ponieważ zmiany nie zostaną usunięte przez aktualizacje lub cokolwiek innego.

Dziwne, że programy uruchamiające nie respektują żadnych zmiennych środowiskowych, wpisów rejestru itp. Jeśli nie -shellzostanie przekazane w wierszu poleceń, aby je zastąpić, LOGINSHELL=bashzostaną użyte domyślne ustawienia, które początkowo wymusza.

FeRD
źródło
0

EDYCJA: Poniższe dotyczy starszych wersji MSYS2. Od 21.01.2020 nie jest już wymagane. Odpowiedź FeRD wydaje się działać najlepiej.

Chciałem użyć ryby zamiast bash. Niestety większość metod tutaj nie działała, być może dlatego, że składnia ryb jest tak inna.

To, co działało najlepiej, to pomysł wzhd o uruchomieniu exec fishjako pierwszej rzeczy, gdy zaczyna się bash. Wciąż jednak był problem: gdybym chciał użyć bash, musiałem edytować, .bashrcaby usunąć ten wiersz, ponieważ nawet jeśli uruchomię go z ryb, po prostu uruchomiłbym kolejną instancję ryby.

Najlepiej jest upewnić się, że exec fishdziała, gdy zaczyna się msys2, ale nie za każdym razem, gdy zaczyna się bash.

Znalazłem sposób poprzez plik msys2_shell.cmdw folderze instalacyjnym msys2. Znalazłem następujące linie:

set SHELL_ARGS=

:collectparams

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

Wygląda na to, że definiują parametry, które mają zostać przekazane do bashu, gdy tylko się rozpocznie, ale tylko wtedy, gdy ten skrypt zostanie uruchomiony (w przeciwieństwie do .bashrc). Więc dodałem ten wiersz zaraz po:

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

Jak dotąd wszystko wydaje się w porządku. Uruchamianie msys2 zastępuje bash rybą, gdy tylko poprzednie zakończy ładowanie, ale jeśli potrzebuję linii poleceń bash, nadal mogę po prostu zacząć bash.

George T.
źródło