Alterar shell padrão no MSYS2


14

Quero alterar o shell padrão do MSYS2 de bashpara zsh.

Eu tentei chsh- não disponível no MSYS2.
A edição /etc/passwdnão faz nada. Parece ser ignorado.

Analisei os scripts em lote no diretório raiz do MSYS2 e o código bashé codificado. Alterei todos /usr/bin/bashpara /usr/bin/zsh, o que funcionou bem, até que tentei usar o MinGW.

Onde posso alterar o shell do MSYS2 (corretamente), se possível?

Respostas:


8

Acabei de encontrar este problema. Para executar o zsh, fiz o seguinte:

  • MSYS2 instalado
  • No diretório em que instalei o MSYS2, executei mingw32_shell.bat
  • Atualizou todos os pacotes instalados executando pacman -Syu
  • Zsh instalado e curl executando pacman -Sy zsh curl
  • Fechei o shell do MinGW executando exit- eu não executei zshimediatamente após a instalação.
  • Editou msys2_shell.bat, mingw32_shell.bat e mingw64_shell.bat e alterou todas as instâncias de: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* para: start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (na linha 39 a partir de 23/09/2015)
  • Correu mingw32_shell.bat
  • No menu de configuração do zsh, seleciono 0para criar o arquivo .zshrc.

Quando a configuração terminou, vi:

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

O que não parecia certo ... já rmque nunca deveria ser encontrado um sistema * nix saudável (acho que é um bug do pacote zsh do MSYS2), mas tudo correu bem depois disso.

A primeira vez que tentei isso quando executei, abriu um arquivo em lotes para criar uma nova sessão e recebi um erro sobre o espaço de memória do zsh já estar ocupado. Para corrigir isso, fechei todas as janelas abertas do MinTTY e executei o autorebase.batarquivo no diretório de instalação do MSYS2. Tudo funcionou depois disso.

Então eu instalei o oh-my-zsh. Usando:

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


Eu estava tentando fazer basicamente esse método e não conseguia fazer o peixe funcionar sem erro.
LeetNightshade 12/04/19

1
O rmé realmente realmente inocente. O final do /usr/share/zsh/functions/Newuser/zsh-newuser-installscript contém um rm -f $tmpfile*para limpar depois de si próprio. É exatamente o mesmo na atual instalação do meu Fedora /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD 04/07/19

24

Eu me deparei com isso usando o mais recente msys2-launcher, que fornece .exelançadores em vez de arquivos em lote.

Para isso, era simplesmente uma questão de mudar os .iniarquivos junto com os lançadores de dentro do diretório raiz Msys2 (para uma instalação de 64 bits, ele pode conter msys2.ini, mingw32.inie mingw64.ini). Para cada um desses arquivos ini, adicione uma linha para definir o shell:

SHELL=/usr/bin/zsh

Esta é a maneira direta de definir zshcomo o shell. Para configurar o oh-my-zsh, pode-se considerar esse método - a skelparte realmente não se aplica ao msys2 até onde eu vejo.
TNT

1
Esta é a resposta correta para o msys2 mais recente a partir de julho de 2018. A resposta aceita não funciona mais.
GaryO

não funciona mais (14/03/19)
letroll

5

Edite /etc/nsswitch.confe altere a configuração abaixo:

db_shell: /bin/zsh

Isso funciona, mas parece uma versão bastante hackiana da solução de Alan Pearce.
TNT

Eu não consegui fazer isso funcionar tentando usar peixe.
LeetNightshade 12/04/19

Também encontrei esta resposta aqui: github.com/elieux/msys2-launcher/issues/…, mas a resposta de Alan Pearce parece mais agradável. No entanto, ambos funcionam e você também pode definir o shell dentro do msys2_shell.cmdarquivo bat, mas alterá-lo no .cmdarquivo não afeta o shell se você precisar iniciar com um dos .exes
Jose

4

Quando a alteração do shell padrão não é suportada, uma maneira de usar o shell que você gosta é iniciá-lo imediatamente quando o shell padrão é iniciado.

Por exemplo, basta escrever zshpara ~/.bashrc, e quando o bash iniciar, ele executará o zsh para você. De qualquer forma, um processo disperso do bash permanece em execução e é necessário encerrar o shell duas vezes ao efetuar logout. Para melhorar, escreva em exec zshvez de zsh, dessa maneira, o processo bash ser completamente substituído por um processo zsh.

Este método não é perfeito, mas deve funcionar bem na maioria dos casos. Comparado à alteração de valores codificados, pode causar menos problemas de compatibilidade.

É mencionado pela primeira vez nesta resposta no StackOverflow .


Nada de bom ou bom nisso, mas funciona com o mínimo de confusão.
LeetNightshade 12/04/19

3

Meu instalar se não tiver os arquivos mencionados na resposta aceita ( msys2_shell.bat, mingw32_shell.bat, e mingw64_shell.bat).

Em vez disso, minha instalação do sistema Win10 do MSYS2 (usando o arquivo do instalador msys2-x86_64-20161025.exe) possui um único arquivo, msys2_shell.cmdcom a linha:

set "LOGINSHELL=bash"

Eu mudei bashpara zsh. Parece funcionar até agora.


sua solução não funcionou para mim no Win7 você fez outras coisas depois disso?
Letroll 20/03/19

1
Desculpe, não tenho mais informações. Eu mudei para a WSL, que funciona para minhas necessidades. Boa sorte.
Xtian

isso funcionou para mim no win10
Jose

no entanto, se você precisa para começar msys2 de um dos .exearquivos, então isso não vai definir o shell, para esse olhar para a resposta de Alan Pearce
Jose

1

Eu tenho uma solução, mas requer que você use o ConEmu em vez de qualquer outro terminal que esteja usando no momento. Experimente, porém, na minha opinião, é o melhor aplicativo de terminal no Windows.

Primeiro de tudo, você precisará instalar o zsh usando o pacman. Eu acho que você já chegou tão longe. Em seguida, você precisará instalar o ConEmu (o que você pode fazer com o Chocolatey ou apenas fazendo o download do instalador no site do conemu). Nas configurações do ConEmu, em 'Tarefas', você deve adicionar uma nova tarefa. Provavelmente já tem um chamado Bash::Msys2-64ou algo assim, então talvez você faça um chamado Zsh::Msys2-64. O nome é arbitrário em qualquer caso. Na caixa 'Comandos' desta nova tarefa, você pode basicamente copiar o comando Bash::Msys2-64e substituí-lo zsh.exequando apropriado. O meu é como:

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

Em seguida, nas opções de inicialização do ConEmu, você pode definir isso como sua tarefa de inicialização, para que a abertura do ConEmu o leve diretamente ao seu Zsh todas as vezes. Obviamente, você também pode definir uma combinação de teclas para abri-lo ou qualquer outra tarefa em uma nova guia ou o que quiser. O ConEmu tem muitas opções, então eu tenho certeza que você poderá configurá-lo como quiser.


0

Os desenvolvedores do MSYS2 obviamente continuam alterando sua configuração, porque nas instalações mais recentes , o msys2_shellcomando instalado no Windows para iniciar o (s) ambiente (s) MSYS2 aceita um -shellargumento.

Portanto, para usar um shell diferente, você pode editar as Propriedades de um ou mais dos lançadores do MSYS2 / MinGW 32 / MinGW 64 e atualizar o Target para adicionar -shell zshou o que for. (Se o shell estiver $PATHadequado para o ambiente MSYS, você não precisará do caminho completo.)

Então, por exemplo, no iniciador "MSYS2 MinGW 64 bits" em "MSYS2 64bit" no meu menu Iniciar do Win7:

Antes
Alvo: C:\msys64\msys2_shell.cmd -mingw64
Depois de
Alvo: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

Essa parece ser a maneira mais fácil e compatível de alternar permanentemente, pois suas alterações não serão eliminadas por atualizações ou o que for.

Curiosamente, os lançadores não respeitam nenhuma variável de ambiente, entradas de registro, etc. A menos que -shellseja transmitido na linha de comando para substituí-lo, o LOGINSHELL=bashpadrão que ele força inicialmente será usado.


0

EDIT: O seguinte é aplicável a versões anteriores do MSYS2. A partir de 2020-01-21, não é mais necessário. A resposta do FeRD parece funcionar melhor.

Eu queria usar peixe em vez de bash. Infelizmente, a maioria dos métodos aqui não funcionou, possivelmente porque a sintaxe do peixe é muito diferente.

O que funcionou melhor foi a idéia de wzhd sobre correr exec fishcomo a primeira coisa quando o bash começa. No entanto, ainda havia um problema: se eu quisesse usar o bash, precisava editar .bashrcpara remover essa linha, porque, mesmo que eu a execute a partir de fish, ela iniciaria outra instância de fish.

A melhor coisa a fazer é garantir que seja exec fishexecutado quando o msys2 iniciar, mas nem sempre que o bash começar.

A maneira que eu encontrei é através do arquivo msys2_shell.cmdna pasta de instalação do msys2. Eu encontrei estas linhas:

set SHELL_ARGS=

:collectparams

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

Parece que eles estão definindo parâmetros a serem passados ​​para o bash assim que começam, mas somente quando esse script é executado (ao contrário .bashrc). Então eu adicionei esta linha logo após:

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

Tudo parece estar bem até agora. O início do msys2 substitui o bash pelo fish assim que o primeiro termina o carregamento, mas se eu precisar de uma linha de comando do bash, ainda posso iniciá-lo bash.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.