Ubah shell default pada MSYS2

14

Saya ingin mengubah shell default MSYS2 dari bashmenjadi zsh.

Saya sudah mencoba chsh- tidak tersedia di MSYS2.
Editing /etc/passwdtidak melakukan apa-apa. Tampaknya diabaikan.

Aku mengambil melihat script batch dalam direktori root MSYS2 ini, dan bashhardcoded di. Aku berubah setiap /usr/bin/bashuntuk /usr/bin/zsh, yang bekerja dengan baik, sampai saya mencoba menggunakan MinGW.

Di mana saya bisa mengganti shell MSYS2 (dengan benar), jika memungkinkan?

sorbet
sumber

Jawaban:

8

Saya baru saja mengalami masalah ini. Untuk menjalankan zsh, saya melakukan ini:

  • MSYS2 yang diinstal
  • Dari direktori saya menginstal MSYS2, saya berlari mingw32_shell.bat
  • Meningkatkan semua paket yang diinstal dengan menjalankan pacman -Syu
  • Menginstal zsh dan curl dengan menjalankan pacman -Sy zsh curl
  • Tutup cangkang MinGW dengan menjalankan exit- Saya tidak zshsegera menjalankan setelah instalasi.
  • Edit msys2_shell.bat, mingw32_shell.bat, dan mingw64_shell.bat dan ubah setiap instance dari: start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* menjadi: start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (on line 39 pada 2015-09-23)
  • Ran mingw32_shell.bat
  • Pada menu konfigurasi zsh saya memilih 0untuk membuat file .zshrc.

Ketika konfigurasi selesai saya melihat:

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

Yang tidak beres ... karena rmseharusnya tidak pernah ditemukan pada sistem * nix yang sehat (saya kira itu adalah bug dengan paket zsh MSYS2), tetapi semuanya berjalan dengan baik setelah itu.

Pertama kali saya mencoba ini ketika saya menjalankan membuka file batch untuk membuat sesi baru saya menerima kesalahan tentang ruang memori zsh sudah ditempati. Untuk memperbaiki ini, saya menutup semua jendela MinTTY yang terbuka dan menjalankan autorebase.batfile di direktori instalasi MSYS2. Segalanya berhasil setelah itu.

Kemudian saya menginstal oh-my-zsh. Menggunakan:

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

livingstaccato
sumber
Pada dasarnya saya mencoba melakukan metode ini, dan saya tidak dapat membuat ikan bekerja tanpa kesalahan.
leetNightshade
1
The rmsebenarnya sangat tidak bersalah. Akhir /usr/share/zsh/functions/Newuser/zsh-newuser-installskrip berisi rm -f $tmpfile*untuk membersihkan setelah itu sendiri. Persis sama dengan saat menginstal Fedora saya /usr/share/zsh/5.7.1/functions/zsh-newuser-install.
FeRD
24

Saya mengalami ini menggunakan msys2-launcher yang lebih baru, yang menyediakan .exelauncher daripada file batch.

Untuk ini, itu hanya masalah mengubah .inifile bersama peluncur di dalam direktori root Msys2 (untuk instalasi 64-bit, mungkin berisi msys2.ini, mingw32.inidan mingw64.ini). Untuk masing-masing file ini, tambahkan baris untuk mengatur shell:

SHELL=/usr/bin/zsh
Alan Pearce
sumber
Ini adalah cara langsung untuk ditetapkan zshsebagai shell. Untuk mengatur oh-my-zsh kita mungkin mempertimbangkan metode ini - skelbagian ini tidak benar-benar berlaku untuk msys2 sejauh yang saya lihat.
TNT
1
Ini adalah jawaban yang benar untuk msys2 baru pada Juli 2018. Jawaban yang diterima tidak lagi berfungsi.
GaryO
tidak bekerja lagi (14/03/19)
letroll
5

Edit /etc/nsswitch.conf, dan ubah pengaturan di bawah ini:

db_shell: /bin/zsh
Teh Hippo
sumber
Ini berfungsi tetapi tampaknya merupakan versi agak Alan dari solusi Alan Pearce.
TNT
Saya tidak bisa melakukan ini dengan mencoba menggunakan ikan.
leetNightshade
Saya menemukan jawaban ini di sini juga: github.com/elieux/msys2-launcher/issues/… tetapi jawaban Alan Pearce tampaknya lebih baik. Keduanya bekerja dengan baik, dan Anda juga dapat mengatur shell di dalam msys2_shell.cmdfile bat, tetapi mengubahnya dalam .cmdfile tidak mempengaruhi shell jika Anda harus mulai dari salah satu dari .exes
Jose
4

Ketika mengganti shell default tidak didukung, salah satu cara untuk menggunakan shell yang Anda suka adalah segera memulainya ketika shell default dimulai.

Sebagai contoh, hanya menulis zshuntuk ~/.bashrc, dan ketika pesta dimulai, itu akan berjalan zsh untuk Anda. Bagaimana pun proses bash nyasar dibiarkan berjalan, dan Anda harus keluar dari shell dua kali saat logout. Untuk membuatnya lebih baik, tulis exec zshalih-alih zsh, dengan cara ini, proses bash sepenuhnya diganti dengan proses zsh.

Metode ini tidak sempurna tetapi harus bekerja dengan baik dalam banyak kasus. Dibandingkan dengan mengubah nilai-nilai hard-coded, ini dapat menyebabkan lebih sedikit masalah kompatibilitas.

Pertama kali disebutkan dalam jawaban ini di StackOverflow .

wzhd
sumber
Tidak ada yang bagus atau mewah tentang ini, tetapi bekerja dengan sedikit keributan.
leetNightshade
3

My install tidak tidak memiliki file yang disebutkan dalam jawaban yang diterima ( msys2_shell.bat, mingw32_shell.bat, dan mingw64_shell.bat).

Sebaliknya sistem Win10 saya menginstal MSYS2 (menggunakan file installer msys2-x86_64-20161025.exe) memiliki file tunggal, msys2_shell.cmddengan baris:

set "LOGINSHELL=bash"

Saya berubah bashmenjadi zsh. Tampaknya bekerja sejauh ini.

xtian
sumber
solusi Anda tidak bekerja untuk saya di Win7 apakah Anda melakukan hal-hal lain setelah itu?
letroll
1
Maaf, saya tidak memiliki informasi lebih lanjut. Saya pindah ke WSL, yang berfungsi untuk kebutuhan saya. Semoga berhasil.
xtian
ini bekerja untuk saya pada win10
Jose
namun jika Anda perlu menjalankan msys2 dari salah satu .exefile maka ini tidak akan mengatur shell, untuk itu lihat jawaban Alan Pearce
Jose
1

Saya punya solusi tetapi mengharuskan Anda menggunakan ConEmu daripada terminal apa pun yang saat ini Anda gunakan. Cobalah, menurut saya, ini adalah aplikasi terminal terbaik di windows.

Pertama-tama, Anda harus menginstal zsh menggunakan pacman. Saya kira Anda sudah sejauh itu. Kemudian, Anda harus menginstal ConEmu (yang dapat Anda lakukan dengan Chocolatey atau hanya dengan mengunduh installer dari situs conemu). Di pengaturan ConEmu, di bawah 'Tugas', Anda harus menambahkan tugas baru. Mungkin sudah memiliki satu panggilan Bash::Msys2-64atau sesuatu seperti itu, jadi mungkin Anda akan membuat satu panggilan Zsh::Msys2-64. Bagaimanapun nama itu arbitrer. Di kotak 'Perintah' untuk tugas baru ini, Anda pada dasarnya dapat menyalin perintah dari Bash::Msys2-64dan mengganti yang zsh.exesesuai. Milik saya seperti:

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

Kemudian, dalam opsi 'Startup' ConEmu, Anda dapat mengatur ini sebagai tugas startup Anda sehingga membuka ConEmu membuat Anda langsung masuk ke Zsh Anda setiap saat. Jelas Anda juga dapat mengatur kombo kunci untuk membukanya atau tugas lain di tab baru atau apa pun yang Anda inginkan. ConEmu memiliki banyak opsi, jadi saya yakin Anda dapat mengaturnya sesuka Anda.

Okonomiyaki3000
sumber
0

MSYS2 devs jelas terus mengubah pengaturannya, karena pada instalasi terbaru , msys2_shellperintah yang diinstal pada Windows untuk meluncurkan lingkungan MSYS2 menerima -shellargumen.

Jadi, untuk menggunakan shell yang berbeda, Anda dapat mengedit Properties dari satu atau lebih launcher untuk MSYS2 / MinGW 32 / MinGW 64, dan memperbarui Target untuk ditambahkan -shell zshatau apa pun. (Jika shell $PATHuntuk lingkungan MSYS cukup, Anda tidak perlu path lengkap.)

Jadi, untuk mis. Peluncur "MSYS2 MinGW 64-bit" di "MSYS2 64bit" pada menu Mulai Win7 saya:

Sebelum
Target: C:\msys64\msys2_shell.cmd -mingw64
Setelah
Target: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

Tampaknya itu cara termudah dan paling kompatibel untuk beralih secara permanen, karena perubahan Anda tidak akan terhapus oleh peningkatan atau apa pun.

Anehnya peluncur tidak menghormati variabel lingkungan, entri registri, dll. Kecuali jika -shelldilewatkan pada baris perintah untuk menimpanya, LOGINSHELL=bashdefault yang awalnya dipaksakan akan digunakan.

FeRD
sumber
0

EDIT: Di bawah ini berlaku untuk versi MSYS2 sebelumnya. Pada 2020-01-21, tidak diperlukan lagi. Jawaban FeRD tampaknya bekerja paling baik.

Saya ingin menggunakan ikan, bukan bash. Sayangnya sebagian besar metode di sini tidak berhasil, mungkin karena sintaksis ikan sangat berbeda.

Apa yang paling berhasil adalah ide wzhd tentang berlari exec fishsebagai hal pertama ketika bash dimulai. Namun masih ada masalah: Jika saya ingin menggunakan bash, saya harus mengedit .bashrcuntuk menghapus baris itu karena meskipun saya menjalankannya dari ikan, itu hanya akan memulai contoh ikan lain.

Hal terbaik untuk dilakukan adalah memastikan bahwa exec fishberjalan ketika msys2 dimulai, tetapi tidak setiap kali bash dimulai.

Cara saya temukan adalah melalui file msys2_shell.cmddi folder instalasi msys2. Saya menemukan baris-baris ini:

set SHELL_ARGS=

:collectparams

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

Tampaknya mereka mendefinisikan parameter untuk diteruskan ke bash segera setelah dimulai, tetapi hanya ketika skrip ini berjalan (tidak seperti .bashrc). Jadi saya menambahkan baris ini tepat setelah:

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

Segalanya tampak baik-baik saja sejauh ini. Memulai msys2 menggantikan bash dengan ikan segera setelah yang pertama selesai memuat, tetapi jika saya memerlukan baris perintah bash saya masih bisa memulainya dengan bash.

George T
sumber