在Windows上使用Fish替换cmd

9,830 阅读6分钟

在日常开发过程中,我们也需要常常和命令行打交道,而Windows自带的cmd或者PowerShell可能并不总是那么地顺手,尤其是经常使用Linux命令的同学来说。

那么我们能不能在Windows上使用Linux解释器来替代cmd或者PowerShell呢?事实上是完全可以的,借助MSYS2即可。

MSYS2是一款非常强大的工具链,它提供了一个模拟Linux的环境,使得我们可以在Windows上使用Linux的命令,而这些命令都是Windows的exe可执行文件形式,除此之外我们可以使用该环境的bash或者其它终端解释器来替代Windows的cmd,使得我们可以更加高效地使用命令行终端。

今天就以在Msys2下面安装配置fish为例,来讲解如何在Windows上配置Linux的Shell解释器,大家如果想要使用bash或者zsh也是同理。

1,下载并安装MSYS2

进入官方网站:传送门

点击下载安装包文件,安装即可:

image.png

2,配置环境变量

安装完成后,需要将Msys2安装目录\usr\bin这个路径加入至Path环境变量中,例如我将Msys2安装在D:\Program Files\Msys2如下:

image.png

(1) 配置MSYS2_HOME变量

我们可以使用MSYS2_HOME变量表示Msys2的安装路径,在系统环境变量中新建该变量,值为你的Msys2的安装目录,例如我的:

image.png

(2) 加入到Path

然后编辑系统环境变量的Path变量,加入下列行:

%MSYS2_HOME%\usr\bin

如图:

image.png

到此,我们就把Msys2的默认环境加入到Path环境变量了,基本的环境变量配置完成!

如果不想手动配置环境变量,可以下载这个工具一键配置Msys2的环境变量:传送门

3,配置镜像源并更新

在开始菜单找到MSYS2终端打开:

image.png

首先更换清华镜像源,使用下列命令:

sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*

然后执行下列命令更新:

pacman -Syu

第一次更新到一半可能会提示你输入y关闭进程,关闭后重新打开终端再次执行该命令更新即可,重复几次直到无更新提示。

4,配置默认用户目录

在Windows上我们的用户目录通常是C:\Users\%username%,而MSYS2默认使用的是Linux的/home/$USER这个目录,实际对应Msys2安装目录/home/你的用户名,这不符合我们平时习惯。

我们可以修改Msys2的默认用户目录,找到Msys2安装目录\etc\nsswitch.conf文件:

image.png

使用文本编辑器打开,找到下列行:

image.png

将其修改为:

db_home: /c/Users/%U

最终如下:

image.png

5,安装Fish以及常用工具

通过下列命令即可:

pacman -S fish git vim

可见除了安装fish解释器之外,我们还安装了Git和Vim,这样我们无需单独下载Windows版Git进行安装配置了!

6,将fish配置到终端软件

上述我们安装完成了fish解释器,现在我们就可以配置到其它终端软件了!这里将分别介绍在Tabby和Windows Terminal中的配置方式,大家可以选择自己喜欢的终端进行配置。

(1) Tabby

在配置和连接中新建,点击新配置,选择CMD (clink)模板:

image.png

image.png

其中配置如图:

image.png

上述命令行为:

'D:\Program Files\Msys2\msys2_shell.cmd' -msys2 -defterm -here -full-path -no-start -shell fish

注意将D:\Program Files\Msys2换成你自己的安装目录!

可见在Msys2下有个msys2_shell.cmd脚本,该脚本可以使得我们在其它终端例如Windows Terminal、cmd、Tabby等加载Msys2环境,并使用其中的bash或者fish等等,这里我的整个命令参数如下图:

image-20240428210344674

上述参数:

  • -msys2 使用Msys2环境
  • -defterm 使用默认终端
  • -here 使用当前目录作为工作目录
  • -full-path 加载全部Windows的环境变量
  • -no-start 在当前终端窗口加载Msys2环境而不是新起一个终端窗口
  • -shell fish 指定使用fish作为解释器,类似的如果你想用bash则写作:-shell bash

保存,到此一个终端配置完成!

最后,设定默认配置为我们刚刚加入的fish解释器配置即可:

image-20240428210628901

(2) Windows Terminal

进入设置:

image.png

在左侧栏最下面点击添加新配置文件:

image.png

点击新建空配置文件:

image.png

可以自定义配置名称:

image.png

命令行部分填写如下:

"D:\Program Files\Msys2\msys2_shell.cmd" -msys2 -defterm -here -full-path -no-start -shell fish

同样地,记得把上述D:\Program Files\Msys2替换成你自己的Msys2的安装地址,命令行参数意义在上面Tabby部分已经讲解了,这里就不重复讲解了,我的如下图:

image.png

其余配置可以自行配置,最终点击保存:

image.png

最后在左侧栏启动部分,设定默认配置文件为Fish配置即可:

image.png

到此,全部配置完成!我们可以在Windows中使用Linux的Shell解释器以及绝大多数命令了!

7,路径问题

(1) Windows和Linux路径转换

在Msys2中,我们需要使用Linux的路径表示形式,而非Windows路径,比如下列命令的路径表示就是错误的:

# 错误的
cd "C:\Users\swsk33"

要将路径转换成下面这样:

cd "/c/Users/swsk33"

也就是说将盘符例如C:D:替换成/c/d的形式,并且把\换成/即可。

在Msys2环境中,我们可以使用cygpath命令实现Windows和Linux路径相互转换:

# 将Windows路径转换成Linux形式
cygpath -u "Windows路径"

# 将Linux路径转换成Windows路径,正斜杠
cygpath -m "Linux路径"

# 将Linux路径转换成Windows路径,反斜杠
cygpath -w "Linux路径"

例如:

cygpath -u "C:\Program Files\Msys2"
cygpath -m "/etc/apt"
cygpath -w "/etc/apt"

分别结果如下:

image.png

可见Msys2中的根目录/就表示其安装目录。

这样,在Fish中我们可以将cygpath命令的输出作为其它命令输入:

command --path=(cygpath -u "X:\xxx")

(2) 路径自动转换问题

在Msys2中,以及Git Bash中,当我们给命令传递Linux形式路径(以/开头)时,会被Msys2自动地转换成Windows路径,例如当我们使用Msys2的Fish终端调用Docker命令,部署MinIO容器时:

docker run -id --name=minio -p 9000:9000 -p 9001:9001 \
	-v minio-data:/data \
	-e MINIO_ROOT_USER=admin \
	-e MINIO_ROOT_PASSWORD=12345678 \
	-e MINIO_VOLUMES="/data" \
	minio/minio server --console-address ":9001"

我们使用MINIO_VOLUMES环境变量指定MinIO文件存储位置为/data,表示容器内的目录,但是部署后会发现报错:

image.png

这是因为/data被自动地转换成了Windows上的路径(我这里是D:/Program Files/Msys2/data)但是容器内无该路径,导致容器启动失败。

所以,有的时候我们需要关闭路径转换,在Fish中通过下列命令,设定环境变量即可:

# 等同于Bash中的:export MSYS_NO_PATHCONV=1
set -x MSYS_NO_PATHCONV 1

这时就关闭了路径转换,我们的所有路径参数都会按照原样传递给命令,不过仅对当前终端窗口有效,若关闭后重新打开终端,或者开启新终端,就要重新执行上述命令。