Cygwin安装使用指南

793 阅读6分钟

为什么选择Cygwin

如今有多种方式在Windows上使用Unix工具,下面简单对比一下各种方案:

Cygwin

网站www.cygwin.com/

原理:提供一个兼容层(cygwin1.dll),对Unix程序进行透明的API转换

缺点:安装、配置稍微繁琐,包管理差

优点:集成度高,Unix环境和Windows环境文件系统可以直接访问,二进制可以互相调用,PATH、hosts等共享;支持程序多,理论上任何POSIX兼容的可获得源码的程序都可以运行,不过需要编译为使用cygwin1.dll的exe格式

MSYS2

网站www.msys2.org/

原理:基于Cygwinmingw-w64。目标与Cygwin不同,倾向于编译Windows本机程序,而不是提供Unix运行环境。mingw-w64就是编译套件,依赖Cygwin运行auto-tools等构建工具。

缺点:更多是作为一个编译环境,而不是Unix程序的运行环境

优点:有一个好用的包管理器(pacman)

Git Bash

网站gitforwindows.org/

原理: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工具的包管理器,装完以后不要删,后面还会经常用到。

打开安装程序,选择【从互联网安装】。


image

这里建议使用默认路径。【根目录】既是Cygwin的安装目录,也是Unix程序/目录的挂载点。


image

这个目录只是安装Unix软件包时用来存放下载内容的临时目录,随便找个地方就行。


image

这里选一个国内镜像站,可以提高软件包的下载速度。


image

这个页面让我们选择需要安装的软件包,首次安装的时候都保持默认就好,会安装一个干净的“最小环境”。


image

这一步的两个选项都没有必要,Cygwin自带了一个叫做mintty的终端仿真器,但是在新版Windows 10和Windows 11上有Windows Terminal,体验更好。

安装常用工具

再次打开setup-x86_64.exe,一直跳到软件包安装页面,大部分选项在鼠标悬停时都有提示。软件列表顶栏的翻译有些问题。

【新增】指的是下一步的动作,比如【卸载】或者要安装的版本号。

image

【源?】指的是是否下载源代码,一般没有必要。

常用的软件包有: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\binC:\cygwin64\usr\local\bin加到Windows的PATH里,这样就能在PowerShell中用vim、less等命令了,集成体验大大提高,而且不必担心因为忘了加-l参数导致脚本出错。

Home

默认情况下,Cygwin的用户目录和Windows的用户目录是独立的,这当然有损于集成体验。编辑 /etc/nsswitch.conf ,添加一行db_home: windows,就可以使用Windows的用户目录。

image

当然不是非要用vim编辑,Cygwin和Windows的文件系统是互通的,这个文件就在C:\cygwin64\etc\nsswitch.conf

Windows Terminal

Cygwin中安装的Shell可以直接在Windows中调用。

image

Windows Terminal默认没有Cygwin的Profile,但可以自己加。点击【Settings】->【Add a new profile】->【New empty profile】。

image

注意:如果没有像我一样修改Windows的PATH,【Command line】需要在后面添加-l参数。

在【Startup】切换默认Shell。

image

安装配置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后缀。

image

image

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其他都不变。