我想将 MSYS2 的默认 shell 从 更改bash
为zsh
。
我试过了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.ini
、mingw32.ini
和mingw64.ini
)。对于每个 ini 文件,添加一行来设置 shell:
SHELL=/usr/bin/zsh
答案3
我刚刚遇到了这个问题。为了让 zsh 运行,我做了以下操作:
- 已安装 MSYS2
- 从我安装 MSYS2 的目录中,我运行
mingw32_shell.bat
- 通过运行升级所有已安装的软件包
pacman -Syu
- 通过运行安装 zsh 和 curl
pacman -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 上的这个答案。