更改MSYS2上的默认Shell


14

我想将MSYS2的默认shell从更改bashzsh

我已经尝试过chsh-在MSYS2中不可用。
编辑/etc/passwd不执行任何操作。它似乎被忽略了。

我查看了MSYS2根目录中的批处理脚本,并对其bash进行了硬编码。我将每个都更改/usr/bin/bash/usr/bin/zsh,效果很好,直到尝试使用MinGW。

如果有可能,我在哪里可以正确地更改MSYS2的外壳?

Answers:


8

我只是遇到了这个问题。为了使zsh运行,我这样做:

  • 已安装的MSYS2
  • 从我安装了MSYS2的目录中,我运行了 mingw32_shell.bat
  • 通过运行升级所有已安装的软件包 pacman -Syu
  • 通过运行安装zsh和curl pacman -Sy zsh curl
  • 通过关闭运行MinGW的壳exit- 我没有运行zsh在安装后立即。
  • 编辑了msys2_shell.bat,mingw32_shell.bat和mingw64_shell.bat,并将以下每个实例更改为:( start %WD%mintty -i /msys2.ico /usr/bin/bash --login %* 到:) start %WD%mintty -i /msys2.ico /usr/bin/zsh --login %* (截至2015-09-23,在第39行)
  • mingw32_shell.bat
  • 在zsh配置菜单中,我选择0创建.zshrc文件。

配置完成后,我看到了:

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

看起来不太正确...因为rm永远都不能在健康的* nix系统上找到网络(我猜这是MSYS2的zsh软件包的错误),但是此后一切都很好。

当我第一次运行此文件时,我打开一个批处理文件来创建一个新的会话,我收到关于zsh的内存空间已被占用的错误。为了解决这个问题,我关闭了所有打开的MinTTY窗口,并autorebase.bat在MSYS2安装目录中运行了该文件。此后一切正常。

然后我安装了oh-my-zsh。使用:

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


我基本上尝试使用这种方法,但我无法使鱼正常工作。
leetNightshade

1
rm实际上是真正无辜的。/usr/share/zsh/functions/Newuser/zsh-newuser-install脚本的末尾包含一个rm -f $tmpfile*要清除的。与我的Fedora安装版本中的完全相同/usr/share/zsh/5.7.1/functions/zsh-newuser-install
FeRD

24

我使用较新的msys2-launcher遇到了这个问题,它提供.exe启动器而不是批处理文件。

对于这一点,它只是改变的问题.ini文件Msys2根目录下(对于64位安装,它可能包含内部的发射一起msys2.inimingw32.inimingw64.ini)。对于每个ini文件,添加一行以设置外壳程序:

SHELL=/usr/bin/zsh

这是设置zsh为shell 的直接方法。对于设置oh-my-zsh,可以考虑使用此方法 - skel就我所知,该部分实际上并不适用于msys2。
TNT

1
截至2018年7月,这是更新的msys2的正确答案。已接受的答案不再起作用。
GaryO

不再工作了(14/03/19)
letroll

5

编辑/etc/nsswitch.conf,然后更改以下设置:

db_shell: /bin/zsh

这行得通,但似乎是Alan Pearce解决方案的一个相当荒谬的版本。
TNT

我无法尝试使用鱼来工作。
leetNightshade

我也在这里找到了这个答案:github.com/elieux/msys2-launcher/issues/…但是艾伦·皮尔斯(Alan Pearce)的答案似乎更好。两者都可以,但是您也可以在msys2_shell.cmdbat文件中设置外壳,但是.cmd如果您必须从.exes 文件之一开始,则在文件中更改外壳不会影响外壳
Jose

4

当不支持更改默认外壳程序时,一种使用所需外壳程序的方法是在默认外壳程序启动时立即启动它。

例如,只写zsh~/.bashrc,而当bash启动,它将运行zsh的为您服务。流浪bash进程如何继续运行,注销时必须退出shell两次。为了使它更好,请编写exec zsh而不是zsh,用这种方法,将bash进程完全替换为zsh进程。

这种方法并不完美,但在大多数情况下应该可以正常工作。与更改硬编码值相比,它可能导致较少的兼容性问题。

首先在StackOverflow的此答案中提到它。


对此没有什么好看或幻想的,但它的工作量最少。
leetNightshade

3

我的安装并没有在接受的答案中提到的文件(msys2_shell.batmingw32_shell.bat,和mingw64_shell.bat)。

相反,我的Win10系统MSYS2安装(使用installer文件msys2-x86_64-20161025.exe)只有一个文件,msys2_shell.cmd其行如下:

set "LOGINSHELL=bash"

我更改bashzsh。到目前为止似乎工作正常。


您的解决方案在Win7上对我不起作用,之后您还做其他事情吗?
letroll

1
抱歉,我没有进一步的信息。我转到了WSL,它可以满足我的需求。祝好运。
xtian

这个工作对我来说在win10
圣何塞

但是,如果您需要从其中一个.exe文件启动msys2,则不会设置外壳程序,因此请查看Alan Pearce的答案
Jose

1

我有一个解决方案,但是它要求您使用ConEmu而不是当前使用的任何其他终端。在我看来,请尝试一下,它是Windows上最好的终端应用程序。

首先,您需要使用pacman安装zsh。我想你已经走了那么远。然后,您需要安装ConEmu(可以使用Chocolatey进行安装,也可以只从conmumu站点下载安装程序来安装)。在ConEmu设置的“任务”下,您应该添加一个新任务。它可能已经有一个被叫之类的Bash::Msys2-64东西,所以也许您会给一个被叫Zsh::Msys2-64。该名称在任何情况下都是任意的。在此新任务的“命令”框中,您基本上可以从中复制命令Bash::Msys2-64zsh.exe在适当的地方替换。我的就像:

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

然后,在ConEmu的“启动”选项中,可以将其设置为启动任务,以便每次打开ConEmu都可以直接进入Zsh。显然,您还可以设置一个按键组合以将其打开,或者在新选项卡中打开任何其他任务或您想要的任何东西。ConEmu有很多选项,因此我确定您可以根据需要进行设置。


0

MSYS2开发人员显然会继续更改其设置,因为在最新安装中,msys2_shellWindows中安装的用于启动MSYS2环境的命令接受一个-shell参数。

因此,要使用其他外壳,可以编辑一个或多个MSYS2 / MinGW 32 / MinGW 64启动器的属性,并更新目标以添加-shell zsh或进行其他操作。(如果外壳$PATH足够用于MSYS环境,则不需要完整路径。)

因此,对于Win7“开始”菜单上“ MSYS2 64bit”中的“ MSYS2 MinGW 64位”启动器:

之前
目标: C:\msys64\msys2_shell.cmd -mingw64
目标: C:\msys64\msys2_shell.cmd -mingw64 -shell zsh

这似乎是永久切换的最简单,最兼容的方式,因为您的更改不会被升级或其他方式抹去。

奇怪的是,启动器不尊重任何环境变量,注册表项等。除非-shell在命令行中传递以覆盖它,LOGINSHELL=bash否则将使用它最初强制使用的默认值。


0

编辑:下面适用于早期版本的MSYS2。自2020年1月21日起,不再需要它。FeRD的回答似乎效果最好。

我想用鱼代替猛击。不幸的是,这里的大多数方法都不起作用,可能是因为fish的语法是如此不同。

最有效的方法是wzhd exec fish在bash开始时首先将其运行的想法。但是,仍然存在一个问题:如果我想使用bash,我必须进行编辑.bashrc以删除该行,因为即使我从fish运行它,它也只会启动另一个fish实例。

最好的办法是确保它exec fish在msys2启动时运行,而不是在bash每次启动时运行。

我找到的方法是通过msys2_shell.cmdmsys2的安装文件夹中的文件。我发现这些行:

set SHELL_ARGS=

:collectparams

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

看来他们正在定义要在bash开始时立即传递给bash的参数,但仅在该脚本运行时才传递(不同于.bashrc)。所以我在下面添加了这一行:

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

到目前为止,一切似乎还不错。一旦前者完成加载,启动msys2就会用fish替换bash,但是如果我需要bash命令行,我仍然可以使用来启动它bash

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.