Cygwin 在windows上体验linux
喜欢linux,喜欢它的简洁 、喜欢它的高效 、喜欢它的自由,得益于自由软件运动,大佬们开发了一系列诸如cygwin、msys、msys2等让我们不必安装linux系统也能在windows上享受linux特性的软件。这篇文章用于记录本人安装cygwin的经历。
cygwin是
它是
- a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows. 提供与windows上的linux发行版类似功能的大批GNU和开源工具的集合
- a DLL (cygwin1.dll) which provides substantial POSIX API functionality. 提供稳固的POSIX(portable operating system interface x)及API(application program interface)功能的DLL(dynamic link libary)如cygwin.dll
它不是
- a way to run native Linux apps on Windows. You must rebuild your application from source if you want it to run on Windows. 在windows上运行linux原生应用程序的方法。如果需要在windows上运行linux软件必须得从源码重新构建应用程序
- a way to magically make native Windows apps aware of UNIX® functionality like signals, ptys, etc. Again, you need to build your apps from source if you want to take advantage of Cygwin functionality. 让windows的原生程序知道信号、虚拟终端等UNIX功能的方法。如果你想让你的应用程序采用cygwin的功能你将需要从源码重新构建你的应用程序
以上是来自Cygwin项目官网对于cyg的介绍,个人理解cygwin发音[si:gwin]
是cygnet of windows(windows的小天鹅),让喜欢linux却困于windows的人也能有linux的体验。
安装
好了,废话那么多,接下来正经记录下cygwin的安装过程。
- 从官网下载安装包
- 双击安装程序开始安装
2.1. 前面建议默认下一步,有软件安装洁癖的可以选择其他位置安装但路径最好不要带中文2.2. 下载站点选择国内的aliyun或者163的镜像
2.3. 给cygwin添加软件包,初始安装建议安装mingw、wget等软件
安装完之后软件只会在指定路径存放一些文件,这意味着cygwin对windows基本没有更改,这很符合我的口味,哪天用崩了直接把文件删除就好了嘛
配置
前面说了cygwin对windows基本没有更改,除了安装结束时选择了生成桌面快捷方式或者开始菜单图标,这点虽然符合我用软件弃之则删的观念,但是也存在一个新的问题,我该怎么用这个软件呢,接下来让我们稍稍配置下以让我们方便使用这个软件。配置参考gitbash
配置右键菜单
背景右键
win+r
+regedit
打开注册表- 打开路径
HKEY_CLASSES_ROOT\Directory\Background\shell
- 新建项 Cygwin Here(名字随意)
- 将该项的默认值的数值数据改为
Open Cygwin here
(显示在右键菜单的文字) - 新建
字符串值
并修改其数据类型为/path/to/icon
(显示在右键菜单的图标,路径应该为windows格式,如C:\cygwin64\Cygwin-Terminal.ico
) - 新建子项
command
并将其子项设置为cygwin的mintty.exe的路径,如C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico
至此,背景右键菜单启动cygwin功能已实现,如下图所示:

文件夹右键菜单
- 打开注册表路径
HKEY_CLASSES_ROOT\Directory\shell
,新建项和值均与背景右键菜单注册表设置一致 - command子项的默认数值数据需要进行修改,因为仅填写cygwin的路径则启动的终端路径不包含该文件夹,这与gitbash的文件夹右键菜单行为是不符的
- 新建一个批处理文件,内容如下:
bash
@REM 将文件夹路径经由cygpath转换后作为cygwin的终端--dir的参数值传入
for /f "usebackq tokens=*" %%i in (`C:\cygwin64\bin\cygpath.exe %1`) do set tempdir=%%i
C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico --dir %tempdir%
echo %tempdir%
- 将command子项的默认值设置为该批处理文件的路径
至此,文件夹右键菜单启动cygwin功能已实现,如下图所示:

- 文件夹右键菜单这样设置有缺陷,右键启动cygwin时会出现cmd闪烁窗口,如果有强迫症可以采用b2e将批处理程序转换为不可见的可执行程序
- 两种设置右键菜单的方式都会导致cygwin丢失其自身的环境变量,如
/usr/bin
及/usr/local/bin
,需要手动配置.bashrc补全cygwin的环境变量。一种可行的设置为在/path/to/cygwin/home/user/.bashrc
文件中添加如下内容:
.bashrc
USR_LOCAL_BIN="/usr/local/bin"
USR_BIN="/usr/bin"
if [[ ":$PATH:" != *":$USR_BIN:"* ]]; then
export PATH=$USR_BIN:$PATH
fi
if [[ ":$PATH:" != *":$USR_LOCAL_BIN:"* ]]; then
export PATH=$USR_LOCAL_BIN:$PATH
fi
将cygwin设置为vscode的默认终端
Ctrl+Shift+p
输入user setting json- 添加如下内容:
JSON
"terminal.integrated.profiles.windows": {
//vscode的其他终端设置省略
"Cygwin": {
"path": "C:\\cygwin64\\bin\\bash.exe",
"icon": "terminal-linux",
"overrideName": true
}
},
- 将cygwin设置为vscode的默认终端 这样启动终端就能如下图所示了

配置cygwin终端的提示符
按理说到这里应该就差不多勉强能用了,但是你看看人家gitbash的终端提示符:

再回过头看cygwin的终端提示符,这让喜欢自由的我无法接收,其实要实现像gitbash那样的终端提示符也不难,向前文提到过的 /path/to/cygwin/home/usr/.bashrc
文件中添加如下内容:
.bashrc
# 设置git分支信息
function git_branch {
if $(git rev-parse --is-inside-work-tree 2>/dev/null);then
branch=$(git symbolic-ref --short HEAD 2>/dev/null)
[ ! -z "${branch}" ]&&echo "($branch)"
else
echo ""
fi
}
# 处理文件路径挂载的问题
function get_win_dir {
if [[ $(pwd) == "/cygdrive/"* ]];then
echo $(pwd|cut -d'/' -f3-)
elif [[ $(pwd) == ~ ]];then
echo "~"
else
echo "c/cygwin64$(pwd)"
fi
}
# 首次加载计算完毕
COLOR_USER_NAME="\[\033[01;33m\]"
COLOR_AT="\[\033[01;32m\]"
COLOR_HOST_NAME="\[\033[01;35m\]"
COLOR_PATH="\[\033[01;36m\]"
COLOR_BRANCH="\[\033[01;32m\]"
COLOR_DEFAULT="\[\033[00m\]"
FORMATTED_PS1="${COLOR_USER_NAME}\u${COLOR_AT}@${COLOR_HOST_NAME}\h ${COLOR_PATH}"
NEW_LINE="${COLOR_DEFAULT}\n\$"
# 每次进入都要动态计算
PROMPT_COMMAND='PS1="${FORMATTED_PS1}$(get_win_dir)${COLOR_BRANCH}$(git_branch)${NEW_LINE}"'
好看的终端提示符来了

安装包管理软件
到目前位置,如果需要执行的命令软件包在安装阶段已经安装的话,基本就可以结束了,但是如果想要使用的命令在安装阶段没有安装则需要再次启动安装程序并安装对应的软件包(安装程序除了安装cygwin之外似乎还担任着cygwin的包管理器的职责),这太麻烦了,索性有大佬已经考虑到这点了,所以开发了apt-cyg
git clone https://github.com/transcode-open/apt-cyg
克隆apt-cyg仓库cd apt-cyg&&install apt-cyg /bin
进入克隆下来的仓库并安装apt-cyg- 测试包管理器
apt-cyg install tree
,安装可能会出现下面这样的错误,这是因为windows的换行符导致的问题,需要运行dos2unix /bin/apt-cyg
解决问题 - 终端执行
tree
命令
写个程序试试
done and have fun with it!
尾声
- 写完之后我发现cygwin的包管理并不方便,使用setup.exe进行包管理非常繁琐而使用apt-cyg进行包管理又不够方便
- 环境默认依赖
cygwin1.dll
这有点绑架的意思,不开森 - 性能损耗,cygwin将windows的接口进行了封装
- cygwin应该算是自由软件而非linux相关
- 本文仅作为记录自己安装cygwin用