Cambiar shell predeterminado en MSYS2

14

Quiero cambiar el shell predeterminado de MSYS2 de basha zsh.

Lo he intentado chsh, no disponible en MSYS2.
La edición /etc/passwdno hace nada. Parece ser ignorado.

Eché un vistazo a las secuencias de comandos por lotes en el directorio raíz de MSYS2, y bashestá codificado. Cambié todo /usr/bin/basha /usr/bin/zsh, que funcionó bien, hasta que intenté usar MinGW.

¿Dónde puedo cambiar el shell de MSYS2 (correctamente), si es posible?

sorbete
fuente

Respuestas:

8

Acabo de encontrarme con este problema. Para ejecutar zsh hice esto:

  • MSYS2 instalado
  • Desde el directorio que instalé MSYS2, ejecuté mingw32_shell.bat
  • Se actualizaron todos los paquetes instalados ejecutando pacman -Syu
  • Instalado zsh y curl ejecutando pacman -Sy zsh curl
  • Cerré el shell de MinGW ejecutando exit: no ejecuté zshinmediatamente después de la instalación.
  • Editó msys2_shell.bat, mingw32_shell.bat y mingw64_shell.bat y modificó cada instancia de: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* a: start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (en la línea 39 a partir del 23/09/2015)
  • Corrió mingw32_shell.bat
  • En el menú de configuración de zsh, selecciono 0crear el archivo .zshrc.

Cuando terminó la configuración, vi:

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

Lo que no se veía bien ... ya rmque nunca debería encontrarse en un sistema saludable * nix (supongo que es un error con el paquete zsh de MSYS2), pero todo funcionó bien después de eso.

La primera vez que intenté esto cuando ejecuté abrí un archivo por lotes para crear una nueva sesión, recibí un error acerca de que el espacio de memoria de zsh ya estaba ocupado. Para solucionar esto, cerré todas las ventanas abiertas de MinTTY y ejecuté el autorebase.batarchivo en el directorio de instalación de MSYS2. Todo funcionó después de eso.

Luego instalé oh-my-zsh. Utilizando:

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

livingstaccato
fuente
Estaba tratando de hacer básicamente este método, y no pude hacer que los peces funcionen sin errores.
leetNightshade
1
El rmes realmente muy inocente. El final de la /usr/share/zsh/functions/Newuser/zsh-newuser-installsecuencia de comandos contiene un rm -f $tmpfile*para limpiar después de sí mismo. Es exactamente lo mismo en la instalación actual de mi Fedora /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD
24

Me encontré con esto usando el nuevo msys2-launcher, que proporciona .exelanzadores en lugar de archivos por lotes.

Para esto, se trataba simplemente de cambiar los .iniarchivos junto con los lanzadores dentro del directorio raíz Msys2 (para una instalación de 64 bits, podría contener msys2.ini, mingw32.iniy mingw64.ini). Para cada uno de esos archivos ini, agregue una línea para configurar el shell:

SHELL=/usr/bin/zsh
Alan Pearce
fuente
Esta es la forma directa de establecer zshcomo shell. Para configurar oh-my-zsh, uno podría considerar este método : la skelparte realmente no se aplica a msys2 por lo que veo.
TNT
1
Esta es la respuesta correcta para el nuevo msys2 a partir de julio de 2018. La respuesta aceptada ya no funciona.
GaryO
no funciona más (14/03/19)
letroll
5

Edite /etc/nsswitch.confy cambie la configuración a continuación:

db_shell: /bin/zsh
El hipopótamo
fuente
Esto funciona pero parece una versión bastante hack de la solución de Alan Pearce.
TNT
No pude hacer que esto funcione tratando de usar pescado.
leetNightshade
También encontré esta respuesta aquí: github.com/elieux/msys2-launcher/issues/… pero la respuesta de Alan Pearce parece más agradable. Sin embargo, ambos funcionan, y también puede configurar el shell dentro del msys2_shell.cmdarchivo bat, pero cambiarlo en el .cmdarchivo no afecta el shell si tiene que comenzar desde uno de los .exes
Jose
4

Cuando no se admite el cambio del shell predeterminado, una forma de usar el shell que le gusta es iniciarlo inmediatamente cuando se inicia el shell predeterminado.

Por ejemplo, solo escriba zshy ~/.bashrc, cuando comience bash, ejecutará zsh por usted. Sin embargo, un proceso de bash perdido se deja ejecutar, y debe cerrar Shell dos veces al cerrar sesión. Para hacerlo mejor, escriba en exec zshlugar de zsh, de esta manera, el proceso bash se reemplaza completamente con un proceso zsh.

Este método no es perfecto, pero debería funcionar bien en la mayoría de los casos. En comparación con el cambio de valores codificados, puede causar menos problemas de compatibilidad.

Se menciona por primera vez en esta respuesta en StackOverflow .

wzhd
fuente
No hay nada bueno o elegante en esto, pero funciona con el menor alboroto.
leetNightshade
3

Mi instalar hizo no tener los archivos mencionados en la respuesta aceptada ( msys2_shell.bat, mingw32_shell.baty mingw64_shell.bat).

En cambio, mi instalación del sistema Win10 de MSYS2 (usando el archivo instalador msys2-x86_64-20161025.exe) tiene un solo archivo, msys2_shell.cmdcon la línea:

set "LOGINSHELL=bash"

He cambiado basha zsh. Parece funcionar hasta ahora.

xtian
fuente
su solución no funcionó para mí en Win7, ¿ha hecho otras cosas después de eso?
letroll
1
Lo siento, no tengo más información. Me mudé a WSL, que funciona para mis necesidades. Buena suerte.
xtian
esto funcionó para mí en win10
José
sin embargo, si necesita iniciar msys2 desde uno de los .exearchivos, entonces esto no configurará el shell, para que observe la respuesta de Alan Pearce
José
1

Tengo una solución, pero requiere que uses ConEmu en lugar de cualquier otra terminal que estés usando actualmente. Pruébalo, sin embargo, en mi opinión, es la mejor aplicación de terminal en Windows.

En primer lugar, deberá instalar zsh con pacman. Supongo que ya has llegado tan lejos. Luego, necesitará instalar ConEmu (que puede hacer con Chocolatey o simplemente descargando el instalador desde el sitio de conemu). En la configuración de ConEmu, en 'Tareas', debe agregar una nueva tarea. Probablemente ya tenga una llamada Bash::Msys2-64o algo así, así que tal vez haga una llamada Zsh::Msys2-64. El nombre es arbitrario en cualquier caso. En el cuadro 'Comandos' para esta nueva tarea, básicamente puede copiar el comando Bash::Msys2-64y sustituirlo zsh.execuando corresponda. El mío es como:

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

Luego, en las opciones de 'Inicio' de ConEmu, puede configurar esto como su tarea de inicio para que abrir ConEmu lo lleve directamente a su Zsh cada vez. Obviamente, también puede configurar un combo de teclas para abrirlo o cualquier otra tarea en una nueva pestaña o lo que desee. ConEmu tiene muchas opciones, así que estoy seguro de que podrás configurarlo como quieras.

Okonomiyaki3000
fuente
0

Los desarrolladores de MSYS2 obviamente siguen cambiando su configuración, porque en las instalaciones más recientes , el msys2_shellcomando que está instalado en Windows para iniciar los entornos MSYS2 acepta un -shellargumento.

Por lo tanto, para usar un shell diferente, puede editar las Propiedades de uno o más de los lanzadores para MSYS2 / MinGW 32 / MinGW 64, y actualizar el Destino para agregar -shell zsho lo que sea. (Si el shell está en $PATHel entorno MSYS que es suficiente, no necesita la ruta completa).

Entonces, por ejemplo, para el iniciador "MSYS2 MinGW 64-bit" en "MSYS2 64bit" en mi menú de inicio de Win7:

antes de
Objetivo: C:\msys64\msys2_shell.cmd -mingw64
Después
Objetivo: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

Esa parece ser la forma más fácil y compatible de cambiar de forma permanente, ya que sus cambios no serán eliminados por las actualizaciones o lo que sea.

Por extraño que parezca, los lanzadores no respetan ninguna variable de entorno, entradas de registro, etc. A menos que -shellse pase en la línea de comando para anularlo, LOGINSHELL=bashse usará el valor predeterminado que fuerza inicialmente.

FeRD
fuente
0

EDITAR: lo siguiente es aplicable a versiones anteriores de MSYS2. A partir de 2020-01-21, ya no es necesario. La respuesta de FeRD parece funcionar mejor.

Quería usar pescado en lugar de bash. Desafortunadamente, la mayoría de los métodos aquí no funcionaron, posiblemente porque la sintaxis de los peces es muy diferente.

Lo que funcionó mejor fue la idea de wzhd de correr exec fishcomo lo primero cuando comienza bash. Sin embargo, todavía había un problema: si quería usar bash, tenía que editar .bashrcpara eliminar esa línea porque incluso si la ejecutaba desde fish solo comenzaría otra instancia de fish.

Lo mejor que puede hacer es asegurarse de que se exec fishejecute cuando comience msys2, pero no cada vez que comience bash.

La forma en que encontré es a través del archivo msys2_shell.cmden la carpeta de instalación de msys2. Encontré estas líneas:

set SHELL_ARGS=

:collectparams

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

Parece que están definiendo parámetros para pasar a bash tan pronto como comience, pero solo cuando se ejecuta este script (a diferencia .bashrc). Entonces agregué esta línea justo después:

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

Todo parece estar bien hasta ahora. Iniciar msys2 reemplaza bash con fish tan pronto como el primero termine de cargarse, pero si necesito una línea de comando bash, aún puedo comenzar bash.

George T
fuente