为什么选择Cygwin
如今有多种方式在Windows上使用Unix工具,下面简单对比一下各种方案:
Cygwin
原理:提供一个兼容层(cygwin1.dll),对Unix程序进行透明的API转换
缺点:安装、配置稍微繁琐,包管理差
优点:集成度高,Unix环境和Windows环境文件系统可以直接访问,二进制可以互相调用,PATH、hosts等共享;支持程序多,理论上任何POSIX兼容的可获得源码的程序都可以运行,不过需要编译为使用cygwin1.dll的exe格式
MSYS2
原理:基于Cygwin和mingw-w64。目标与Cygwin不同,倾向于编译Windows本机程序,而不是提供Unix运行环境。mingw-w64就是编译套件,依赖Cygwin运行auto-tools等构建工具。
缺点:更多是作为一个编译环境,而不是Unix程序的运行环境
优点:有一个好用的包管理器(pacman)
Git Bash
原理:Git Bash是Git for Windows的一个组件,基于MSYS2,自带了Bash和其他一些Unix工具。
缺点:集成度一般。主要用途是方便git的命令行使用,顺带提供了一些Unix工具。Shell只有Bash,安装使用其他Shell既麻烦又不优雅。
优点:Git for Windows自带的,安装简单,开箱即用
WSL
网站:learn.microsoft.com/en-us/windo…
原理:这里的WSl特指WSL2。本质上是虚拟机,基于Hyper-V,额外做了一些兼容工作,比如在Linux下挂载Windows文件系统等。
缺点:集成度差,基于虚拟机的环境互通非常有限。Linux子系统是完整的独立系统,有发行版差别,需要维护两套环境。安装繁琐,启动慢,Hyper-V与其他虚拟机软件冲突。
优点:暂未发现
安装Cygwin
下载链接:www.cygwin.com/setup-x86_6…
这个程序既是Cygwin本身的安装包,也是其他Unix工具的包管理器,装完以后不要删,后面还会经常用到。
打开安装程序,选择【从互联网安装】。
这里建议使用默认路径。【根目录】既是Cygwin的安装目录,也是Unix程序/
目录的挂载点。
这个目录只是安装Unix软件包时用来存放下载内容的临时目录,随便找个地方就行。
这里选一个国内镜像站,可以提高软件包的下载速度。
这个页面让我们选择需要安装的软件包,首次安装的时候都保持默认就好,会安装一个干净的“最小环境”。
这一步的两个选项都没有必要,Cygwin自带了一个叫做mintty的终端仿真器,但是在新版Windows 10和Windows 11上有Windows Terminal,体验更好。
安装常用工具
再次打开setup-x86_64.exe,一直跳到软件包安装页面,大部分选项在鼠标悬停时都有提示。软件列表顶栏的翻译有些问题。
【新增】指的是下一步的动作,比如【卸载】或者要安装的版本号。
【源?】指的是是否下载源代码,一般没有必要。
常用的软件包有:gcc-core、gcc-g++、make、vim、zsh等。选好软件点下一步就能安装了。
注意:Cygwin有依赖分析,安装软件包时会自动安装依赖,但删除软件包时不会自动清理依赖。显式安装的软件包在【已选择】,【已选择】中不作为依赖的在【可卸载】,作为依赖安装但其上层已被卸载的在【不需要的】。
注意:像Git、Python等本身就提供Windows版本的软件不建议使用Cygwin安装,原生版本不论是性能、更新、集成度,还是支持维护都要更好。Windows原生程序的缺点是不能识别Unix路径,但可以使用cygpath转换。
配置Cygwin
PATH
Cygwin自动同步Windows环境变量(包括PATH),并且把PATH转换成Unix格式(冒号分隔,路径映射)。
Cygwin自身的bin目录依赖 /etc/profile 添加到PATH中,这是Unix惯用的方式。
这种方式有好有坏:
坏处:
-
必须以
-l
参数启动父Shell,否则/etc/profile不会被读取,Unix工具无法直接使用 -
Windows环境(比如PowerShell)无法直接使用Cygwin的Unix工具
好处:以-l
参数启动后,可以用/etc/profile做一系列初始化操作
我个人倾向于把C:\cygwin64\bin
和C:\cygwin64\usr\local\bin
加到Windows的PATH里,这样就能在PowerShell中用vim、less等命令了,集成体验大大提高,而且不必担心因为忘了加-l
参数导致脚本出错。
Home
默认情况下,Cygwin的用户目录和Windows的用户目录是独立的,这当然有损于集成体验。编辑 /etc/nsswitch.conf ,添加一行db_home: windows
,就可以使用Windows的用户目录。
当然不是非要用vim编辑,Cygwin和Windows的文件系统是互通的,这个文件就在C:\cygwin64\etc\nsswitch.conf。
Windows Terminal
Cygwin中安装的Shell可以直接在Windows中调用。
Windows Terminal默认没有Cygwin的Profile,但可以自己加。点击【Settings】->【Add a new profile】->【New empty profile】。
注意:如果没有像我一样修改Windows的PATH,【Command line】需要在后面添加-l
参数。
在【Startup】切换默认Shell。
安装配置Zsh
安装Zsh
直接在setup-x86_64.exe搜zsh安装即可,这里只有zsh本体,没有插件。
安装插件
由于本人不喜欢Oh My Zsh,所以本节仅介绍手动安装过程,需要Oh My Zsh的自行搜索。
zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
cd zsh-syntax-highlighting
make install
cd ..
rm -rf zsh-syntax-highlighting
zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions.git
cd zsh-autosuggestions
install -Dm644 -t /usr/local/share/zsh-autosuggestions zsh-autosuggestions.zsh
install -Dm644 -t /usr/local/share/doc/zsh-autosuggestions CHANGELOG.md LICENSE README.md
cd ..
rm -rf zsh-autosuggestions
配置Zsh
创建配置文件 ~/.zshrc
开启自动补全
autoload -Uz compinit
compinit
可以根据自己喜好加一些zstyle配置,我个人的一些配置:
zstyle ':completion:*' menu true=long select
zstyle ':completion:*' completer _complete _correct
zstyle ':completion:*' list-colors '=*=36'
zstyle ':completion:*' matcher-list '+m:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'l:|=* r:|=*'
Cygwin对Zsh的集成做的不如Bash。在Bash中,命令提示会忽略.exe后缀,更像是Unix环境。而Zsh则把带后缀和不带后缀的都列出来了,体验很不好,需要手动忽略.exe后缀。
zstyle ':completion:*:-command-:*' ignored-patterns '*.exe' '*.dll'
应用插件
source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh
历史记录
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
Prompt
参考:zsh.sourceforge.io/Doc/Release…
普通样式:
PROMPT='[%n@%m %~]$# '
alias
按个人喜好添加
alias ls='ls -h ---color=auto'
alias grep='grep ---color=auto'
alias df='df -h'
alias du='du -h'
添加Windows Terminal配置
参考之前Bash的配置,除了把bash改成zsh其他都不变。