更改 MSYS2 上的默认 shell

更改 MSYS2 上的默认 shell

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

我试过了chsh- 在 MSYS2 中不可用。
编辑/etc/passwd没有任何效果。它似乎被忽略了。

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

如果可能的话,我可以在哪里(正确地)更改 MSYS2 的 shell?

答案1

MSYS2 开发人员显然一直在改变他们的设置,因为在最新安装,msys2_shell在 Windows 中安装的用于启动 MSYS2 环境的命令接受一个-shell参数。

因此,要使用不同的 shell,您可以编辑 MSYS2 / MinGW 32 / MinGW 64 的一个或多个启动器的属性,并更新目标以添加-shell zsh或任何其他内容。(如果 shell 适用$PATH于 MSYS 环境,则不需要完整路径。)

因此,例如,我的 Win7 开始菜单上的“MSYS2 64bit”中的“MSYS2 MinGW 64-bit”启动器:

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

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

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

答案2

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

为此,只需更改 Msys2 根目录中启动器旁边的文件即可.ini(对于 64 位安装,它可能包含msys2.inimingw32.inimingw64.ini)。对于每个 ini 文件,添加一行来设置 shell:

SHELL=/usr/bin/zsh

答案3

我刚刚遇到了这个问题。为了让 zsh 运行,我做了以下操作:

  • 已安装 MSYS2
  • 从我安装 MSYS2 的目录中,我运行mingw32_shell.bat
  • 通过运行升级所有已安装的软件包pacman -Syu
  • 通过运行安装 zsh 和 curlpacman -Sy zsh curl
  • 通过运行关闭 MinGW shell 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)"

答案4

当不支持更改默认shell时,使用您喜欢的shell的一种方法是在默认shell启动时立即启动它。

例如,只需写入zsh~/.bashrc当 bash 启动时,它将为您运行 zsh。但是,如果有一个闲置的 bash 进程仍在运行,则您必须在注销时退出 shell 两次。为了使其更好,请写入exec zsh而不是zsh,这样,bash 进程将完全被 zsh 进程取代。

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

它首次被提及于StackOverflow 上的这个答案

相关内容