Modifica la shell predefinita su MSYS2


14

Voglio cambiare la shell predefinita di MSYS2 da basha zsh.

Ho provato chsh- non disponibile in MSYS2.
La modifica /etc/passwdnon fa nulla. Sembra essere ignorato.

Ho dato un'occhiata agli script batch nella directory principale di MSYS2, ed bashè hardcoded in. Ho cambiato tutti /usr/bin/bashin /usr/bin/zsh, che ha funzionato bene, fino a quando ho provato ad usare MinGW.

Dove posso cambiare la shell di MSYS2 (correttamente), se possibile?

Risposte:


8

Ho appena incontrato questo problema. Per far funzionare zsh ho fatto questo:

  • MSYS2 installato
  • Dalla directory che ho installato MSYS2, ho eseguito mingw32_shell.bat
  • Aggiornato tutti i pacchetti installati eseguendo pacman -Syu
  • Zsh e arricciatura installati eseguendo pacman -Sy zsh curl
  • Chiusa la shell MinGW eseguendo exit- Non ho eseguito zshimmediatamente dopo l'installazione.
  • Modificato msys2_shell.bat, mingw32_shell.bat e mingw64_shell.bat e modificato ogni istanza di: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* in: start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (sulla riga 39 a partire dal 23/09/2015)
  • Corse mingw32_shell.bat
  • Nel menu di configurazione di zsh, seleziono 0per creare il file .zshrc.

Al termine della configurazione ho visto:

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

Il che non sembrava giusto ... dato rmche non dovrebbe mai essere trovato su un sistema sano * nix (suppongo sia un bug con il pacchetto zsh di MSYS2), ma dopo tutto è andato bene.

La prima volta che ho provato questo, quando ho aperto un file batch per creare una nuova sessione, ho ricevuto un errore sullo spazio di memoria di zsh già occupato. Per risolvere questo problema ho chiuso tutte le finestre MinTTY aperte ed eseguito il autorebase.batfile nella directory di installazione di MSYS2. Dopo tutto ha funzionato.

Quindi ho installato oh-my-zsh. usando:

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


Stavo cercando di fare sostanzialmente questo metodo e non riuscivo a far funzionare il pesce senza errori.
leetNightshade,

1
In rmrealtà è davvero innocente. La fine dello /usr/share/zsh/functions/Newuser/zsh-newuser-installscript contiene un rm -f $tmpfile*da ripulire dopo se stesso. È esattamente lo stesso nell'attuale installazione di Fedora /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD

24

Mi sono imbattuto in questo usando il più recente msys2-launcher, che fornisce .exelanciatori anziché file batch.

Per questo, era semplicemente una questione di cambiare i .inifile a fianco dei lanciatori all'interno della directory principale Msys2 (per un'installazione a 64 bit, potrebbe contenere msys2.ini, mingw32.inie mingw64.ini). Per ciascuno di quei file ini, aggiungi una riga per impostare la shell:

SHELL=/usr/bin/zsh

Questo è il modo diretto di impostare zshcome shell. Per la configurazione di oh-my-zsh si potrebbe prendere in considerazione questo metodo : la skelparte in realtà non si applica a msys2 per quanto vedo.
TNT

1
Questa è la risposta corretta per il più recente msys2 a partire da luglio 2018. La risposta accettata non funziona più.
GaryO,

non funziona più (14/03/19)
letroll

5

Modifica /etc/nsswitch.confe modifica l'impostazione di seguito:

db_shell: /bin/zsh

Funziona ma sembra una versione piuttosto hacker della soluzione di Alan Pearce.
TNT

Non riuscivo a farlo funzionare cercando di usare il pesce.
leetNightshade

Ho trovato anche questa risposta qui: github.com/elieux/msys2-launcher/issues/… ma la risposta di Alan Pearce sembra più carina. Entrambi funzionano però, e puoi anche impostare la shell all'interno del msys2_shell.cmdfile bat, ma cambiarla nel .cmdfile non influisce sulla shell se devi iniziare da una delle .exes
Jose

4

Quando la modifica della shell predefinita non è supportata, un modo per utilizzare la shell desiderata è avviarla immediatamente all'avvio della shell predefinita.

Ad esempio, basta scrivere zsha ~/.bashrc, e quando si avvia bash, verrà eseguito zsh per voi. Ogni volta che un processo randagio viene lasciato in esecuzione, e devi uscire due volte dalla shell quando ti disconnetti. Per renderlo migliore, scrivi exec zshinvece zsh, in questo modo, il processo bash viene completamente sostituito con un processo zsh.

Questo metodo non è perfetto ma dovrebbe funzionare bene nella maggior parte dei casi. Rispetto alla modifica di valori hardcoded, potrebbe causare meno problemi di compatibilità.

Viene menzionato per la prima volta in questa risposta su StackOverflow .


Niente di carino o di lussuoso, ma funziona con il minimo sforzo.
leetNightshade

3

Mia installazione ha non avere i file citati nella risposta accettata ( msys2_shell.bat, mingw32_shell.bat, e mingw64_shell.bat).

Invece la mia installazione di sistema Win10 di MSYS2 (usando il file di installazione msys2-x86_64-20161025.exe) ha un singolo file, msys2_shell.cmdcon la riga:

set "LOGINSHELL=bash"

Ho cambiato bashin zsh. Sembra funzionare finora.


la tua soluzione non ha funzionato per me su Win7 hai fatto altre cose dopo?
letroll

1
Siamo spiacenti, non ho ulteriori informazioni. Sono passato a WSL, che funziona per le mie esigenze. In bocca al lupo.
xtian

questo ha funzionato per me su win10
Jose

tuttavia, se è necessario avviare msys2 da uno dei .exefile, questo non imposterà la shell, per quello sguardo nella risposta di Alan Pearce
Jose

1

Ho una soluzione ma richiede che tu usi ConEmu invece di qualsiasi altro terminale che stai attualmente usando. Provalo anche se, a mio avviso, è la migliore app per terminali su Windows.

Prima di tutto, dovrai installare zsh usando pacman. Immagino che tu sia già arrivato così lontano. Quindi, dovrai installare ConEmu (cosa che puoi fare con Chocolatey o semplicemente scaricando il programma di installazione dal sito di Conemu). Nelle impostazioni di ConEmu, in "Attività", è necessario aggiungere una nuova attività. Probabilmente ne ha già uno chiamato Bash::Msys2-64o qualcosa del genere, quindi forse ne farai uno chiamato Zsh::Msys2-64. Il nome è arbitrario in ogni caso. Nella casella "Comandi" per questa nuova attività, puoi sostanzialmente copiare il comando Bash::Msys2-64e sostituirlo zsh.exedove appropriato. Il mio è come:

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

Quindi, nelle opzioni "Avvio" di ConEmu, puoi impostarlo come attività di avvio in modo che l'apertura di ConEmu ti porti sempre nel tuo Zsh ogni volta. Ovviamente puoi anche impostare una combinazione di tasti per aprirla o qualsiasi altra attività in una nuova scheda o qualunque cosa tu voglia. ConEmu ha molte opzioni, quindi sono sicuro che sarai in grado di configurarlo come preferisci.


0

Gli sviluppatori MSYS2 continuano ovviamente a cambiare la loro configurazione, perché nelle installazioni più recenti , il msys2_shellcomando installato in Windows per avviare gli ambienti MSYS2 accetta un -shellargomento.

Pertanto, per utilizzare una shell diversa, è possibile modificare le proprietà di uno o più lanciatori per MSYS2 / MinGW 32 / MinGW 64 e aggiornare la destinazione per aggiungere -shell zsho altro. (Se la shell è in $PATHambiente MSYS sufficiente, non è necessario il percorso completo.)

Quindi, ad esempio il programma di avvio "MSYS2 MinGW 64-bit" in "MSYS2 64bit" nel mio menu Start di Win7:

Prima
Bersaglio: C:\msys64\msys2_shell.cmd -mingw64
Dopo
Bersaglio: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

Questo sembra essere il modo più semplice e compatibile per passare in modo permanente, poiché le modifiche non verranno cancellate dagli aggiornamenti o altro.

Stranamente, i lanciatori non rispettano alcuna variabile d'ambiente, voci di registro, ecc. A meno che non -shellvenga passato sulla riga di comando per sovrascriverlo, LOGINSHELL=bashverrà utilizzato il valore predefinito che inizialmente forza.


0

EDIT: il seguito è applicabile alle versioni precedenti di MSYS2. A partire dal 2020-01-21, non è più necessario. La risposta di FeRD sembra funzionare meglio.

Volevo usare il pesce invece di bash. Sfortunatamente la maggior parte dei metodi qui non ha funzionato, probabilmente perché la sintassi dei pesci è così diversa.

Ciò che ha funzionato meglio è stata l'idea di wzhd di correre exec fishcome prima cosa quando inizia bash. Rimaneva comunque un problema: se volevo usare bash, dovevo modificare .bashrcper rimuovere quella linea perché anche se lo avessi eseguito da fish avrebbe semplicemente avviato un'altra istanza di fish.

La cosa migliore da fare è assicurarsi che exec fishvenga eseguito all'avvio di msys2, ma non ogni volta che inizia bash.

Il modo in cui ho trovato è attraverso il file msys2_shell.cmdnella cartella di installazione di msys2. Ho trovato queste righe:

set SHELL_ARGS=

:collectparams

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

Sembra che stiano definendo i parametri da passare a bash non appena inizia, ma solo quando questo script viene eseguito (diversamente .bashrc). Quindi ho aggiunto questa riga subito dopo:

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

Finora sembra tutto a posto. L'avvio di msys2 sostituisce bash con fish non appena il primo termina il caricamento, ma se ho bisogno di una riga di comando bash posso ancora avviarlo bash.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.