在日常开发过程中,我们也需要常常和命令行打交道,而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
进入官方网站:传送门
点击下载安装包文件,安装即可:
2,配置环境变量
安装完成后,需要将Msys2安装目录\usr\bin
这个路径加入至Path
环境变量中,例如我将Msys2安装在D:\Program Files\Msys2
如下:
(1) 配置MSYS2_HOME
变量
我们可以使用MSYS2_HOME
变量表示Msys2的安装路径,在系统环境变量中新建该变量,值为你的Msys2的安装目录,例如我的:
(2) 加入到Path
然后编辑系统环境变量的Path
变量,加入下列行:
%MSYS2_HOME%\usr\bin
如图:
到此,我们就把Msys2的默认环境加入到Path
环境变量了,基本的环境变量配置完成!
如果不想手动配置环境变量,可以下载这个工具一键配置Msys2的环境变量:传送门
3,配置镜像源并更新
在开始菜单找到MSYS2终端打开:
首先更换清华镜像源,使用下列命令:
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
文件:
使用文本编辑器打开,找到下列行:
将其修改为:
db_home: /c/Users/%U
最终如下:
5,安装Fish
以及常用工具
通过下列命令即可:
pacman -S fish git vim
可见除了安装fish
解释器之外,我们还安装了Git和Vim,这样我们无需单独下载Windows版Git进行安装配置了!
6,将fish
配置到终端软件
上述我们安装完成了fish
解释器,现在我们就可以配置到其它终端软件了!这里将分别介绍在Tabby和Windows Terminal中的配置方式,大家可以选择自己喜欢的终端进行配置。
(1) Tabby
在配置和连接中新建,点击新配置,选择CMD (clink)
模板:
其中配置如图:
上述命令行为:
'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
等等,这里我的整个命令参数如下图:
上述参数:
-msys2
使用Msys2环境-defterm
使用默认终端-here
使用当前目录作为工作目录-full-path
加载全部Windows的环境变量-no-start
在当前终端窗口加载Msys2环境而不是新起一个终端窗口-shell fish
指定使用fish
作为解释器,类似的如果你想用bash
则写作:-shell bash
保存,到此一个终端配置完成!
最后,设定默认配置为我们刚刚加入的fish
解释器配置即可:
(2) Windows Terminal
进入设置:
在左侧栏最下面点击添加新配置文件:
点击新建空配置文件:
可以自定义配置名称:
命令行部分填写如下:
"D:\Program Files\Msys2\msys2_shell.cmd" -msys2 -defterm -here -full-path -no-start -shell fish
同样地,记得把上述D:\Program Files\Msys2
替换成你自己的Msys2的安装地址,命令行参数意义在上面Tabby部分已经讲解了,这里就不重复讲解了,我的如下图:
其余配置可以自行配置,最终点击保存:
最后在左侧栏启动部分,设定默认配置文件为Fish配置即可:
到此,全部配置完成!我们可以在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"
分别结果如下:
可见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
,表示容器内的目录,但是部署后会发现报错:
这是因为/data
被自动地转换成了Windows上的路径(我这里是D:/Program Files/Msys2/data
)但是容器内无该路径,导致容器启动失败。
所以,有的时候我们需要关闭路径转换,在Fish中通过下列命令,设定环境变量即可:
# 等同于Bash中的:export MSYS_NO_PATHCONV=1
set -x MSYS_NO_PATHCONV 1
这时就关闭了路径转换,我们的所有路径参数都会按照原样传递给命令,不过仅对当前终端窗口有效,若关闭后重新打开终端,或者开启新终端,就要重新执行上述命令。