ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Cygwin 是什么:Windows 上的 Unix 兼容层安装配置与避坑

Cygwin 是什么:Windows 上的 Unix 兼容层安装配置与避坑 Cygwin 是什么是 Windows 还是 Linux这个问题我在带新人的时候被问过不下二十遍而且问的人背景还挺两极一边是常年用 Windows 图形界面、突然被安排去改一个只有 Unix 构建脚本的老项目另一边是从 Linux 服务器转过来做客户端开发想在自己笔记本上保留那套熟悉的 shell 手感。Cygwin 刚好卡在这两种需求中间比虚拟机轻比纯 Windows 原生工具更像 Unix但它又不是 Linux。很多人第一次装完看着/cygdrive/c/这种路径直接懵了我到底是在 Windows 上还是在 Linux 上这篇就把这事彻底说透。我会先给 Cygwin 一个明确定性再拆开它的内部结构讲清楚为什么它长这样然后给一套可以照着抄的安装、配置、使用流程最后把我这些年踩过的坑、排查思路和避坑技巧整理成速查表。不管你是刚听说 Cygwin 这个名字还是已经装过但只会敲两下ls看完都能把它当成日常工具用起来。1. 先把定性说清楚Cygwin 是 Windows 程序提供 Unix 接口1.1 一个最容易被绕晕的问题它是操作系统吗直接给结论Cygwin 不是操作系统也不是 Linux 发行版它是一套运行在 Windows 之上的软件集合。你装完 Cygwin 之后机器里并没有多出一个内核也没有多出一套设备驱动C:\cygwin64这个目录里躺着的是实实在在的 Windows PE 格式可执行文件和动态库——和记事本、计算器是同一类东西只是它们讲的是 Unix 的方言。这一点非常关键因为它决定了三件事。第一Cygwin 里的进程在任务管理器里看得见就是普通的 Windows 进程能被 Windows 的权限体系、防火墙、杀毒软件管住。第二Cygwin 的能力上限被 Windows 内核卡死Linux 内核模块、cgroup、命名空间隔离、epoll这些依赖内核的东西它在原理上就提供不了。第三反过来说Cygwin 对 Windows 的兼容性是所有类 Unix 方案里最好的因为它本来就是 Windows 进程调 Windows API 没有任何中间商。我常拿盖房子打比方Windows 是地皮和水电网Cygwin 是在这块地皮上盖的一栋Unix 风格的房子。房子里面的门牌号、插座位置、开关习惯全是 Unix 的样子但水电网还是市政的那一套房子塌不了也搬不走。1.2 三层结构拆解cygwin1.dll、GNU 工具链、setup 包管理器要把 Cygwin 讲明白得把它拆成三层来看这三层缺一不可理解了它们你就理解了 90% 的行为差异。**第一层是cygwin1.dll这是整个项目的灵魂。**它是一个兼容层动态库把 POSIX 接口翻译成 Win32 调用。你敲的fork()、signal()、termios、mmap、pthread、BSD socket全都由它兜底实现。所有 Cygwin 程序都要加载这个 DLL所以它一旦被杀毒软件误删、或者版本对不上你会看到找不到 cygwin1.dll的经典报错。**第二层是 GNU 工具链和 Unix 用户态程序。**bash、coreutils、grep、sed、awk、find、tar、gcc、make、git、python、openssh、rsync 全在这里它们是被人为移植到 Cygwin 上重新编译的版本源码基本没动只改了适配层。所以你在 Cygwin 里写 shell 脚本语法和 Linux 上一模一样因为它跑的就是同一份 GNU 代码。**第三层是setup-x86_64.exe这个包管理器。**注意它不是一个常驻的服务而是一个安装器。你每次想装新包、升级、卸载都是重新运行它。它维护的包数据库在/etc/setup/installed.db下记录着每个包装了哪些文件、版本是多少。这也是为什么 Cygwin 没有apt install这种原生命令——它天生就是重新跑一遍安装器的思路。1.3 三个流传很广的误解逐条拆掉误解一Cygwin 是 Windows 上的 Linux。不是。Linux 是一个内核的名字Cygwin 里没有 Linux 内核代码。Cygwin 提供的只是看起来像 Unix的接口和行为运行的程序是 Windows 二进制不是 ELF 格式file命令一看便知。误解二装了 Cygwin 就等于有了 Linux 命令行。部分正确但会翻车。绝大多数命令行为一致但涉及内核特性、设备文件、网络栈细节的地方会有差异。比如/proc和/dev是模拟出来的内容跟 Linux 不一样再比如某些依赖/dev/random阻塞行为的程序表现会不同。误解三Cygwin 是给老古董用的现在有更好的替代品了。这话在 2016 年 WSL 出来之后确实流行过一阵。但 Cygwin 有自己的生态位它不需要开启系统虚拟化功能不需要管理员级别的系统改动能在受限环境的机器上跑它的进程和 Windows 工具互操作极顺MSYS2 和 Git for Windows 底子上都是它的血脉。说它过时是把不主流和没价值混为一谈了。2. Cygwin 为什么长成这样兼容层的设计取舍2.1 起点把一个编译器搬到 Windows 上Cygwin 的出生动机很朴素——上世纪 90 年代中期一群做编译器工具链的人想让 GNU 的开发工具在 Windows NT 上跑起来。当时的障碍是GNU 工具链里大量代码默认了 Unix 的系统调用比如假设有fork、假设文件描述符能传给子进程、假设有真正的管道和信号。直接改源码工作量巨大于是他们选了一条更聪明的路写一个兼容层让这些假设在 Windows 上成立源码就几乎不用动。这个决策带来的连锁反应一直延续到今天。因为目标是让 Unix 源码不改就能编译所以 Cygwin 追求的是接口完备性而不是性能极致。代价就是后面要讲到的fork慢、文件 IO 慢这些老问题。你可以把它理解成给一群只会说方言的人配了个同声传译传译本身要花时间但省掉了让所有人重学语言的成本。2.2 fork() 是怎么被造出来的如果只能挑一个技术点来解释 Cygwin 的独特之处我一定选fork()。Windows 的进程创建模型是CreateProcess它只能从一个可执行文件从头创建新进程没有把当前进程原样复制一份的原生能力。而 Unix 世界里fork是 shell 执行外部命令的基础动作也是无数脚本、构建工具、测试框架的默认假设。Cygwin 的解法是这样的父进程在调用fork时把自身的内存映像、句柄表、信号状态、文件描述符表等一整套状态打包让子进程在一个特殊的内存区域里还原出来。这套机制能做到看起来和真 fork 一样但代价是每一次纯fork都要拷贝大量内存状态进程占用越大越慢。所以你会观察到一个很典型的现象在 Cygwin 上跑一个内存占用几 GB 的 Java 程序然后它内部频繁fork性能会惨不忍睹而fork之后立刻exec去跑一个新命令的模式也就是 shell 里最常见的用法反而问题不大因为状态还没复制多少就被替换掉了。理解这一点你在排查为什么这个脚本在 Linux 上两秒、在 Cygwin 上二十秒的时候就会少走很多弯路。2.3 四种常见方案横向对比别选错工具新手最容易犯的错是拿四种完全不同的东西互相比较然后得出XX 是垃圾的结论。我把它们放在一张表里说清楚边界。对比维度CygwinWSL2MSYS2传统虚拟机本质Windows 用户态 POSIX 兼容层轻量虚拟化里的真 Linux 内核精简版 Cygwin 加 MinGW 工具链完整独立的操作系统内核Windows 内核Linux 内核Windows 内核Linux 内核程序格式Windows PEELFWindows PEELF内核模块支持不支持支持不支持支持文件 IO 表现一般跨盘更慢内部快跨/mnt慢同 Cygwin取决于共享方式与 Windows 工具互操作极好一般好差系统级改动无需开启虚拟化需开启虚拟化功能无需需虚拟化或独立硬件典型用途脚本、构建、命令行运维完整 Linux 开发环境编译原生 Windows 程序隔离测试、多系统看这张表基本能得出结论如果你要的是在 Windows 上无缝跑 Unix 脚本并且和 Windows 工具频繁互操作Cygwin 是最顺的如果你要的是完整 Linux 内核能力和包管理体验WSL2 更合适如果你要的是编译出不依赖兼容层的原生 Windows 程序那得用 MSYS2 的 MinGW 工具链。三者不是替代关系是不同需求的不同解。3. Cygwin 安装实操从 setup 到第一个能用的终端3.1 安装包选择与三种安装模式官方只提供 64 位安装器setup-x86_64.exe32 位版本已经停止维护别再找了。这个安装器分两个角色安装程序和包管理器装完之后你依然要用它来做所有后续的包维护所以建议把它放在一个固定目录里长期留着比如D:\tools\。运行起来之后第一个岔路口是三种安装模式Install from Internet直接从镜像下载并安装最常用。Download Without Installing只下载到本地缓存目录不装。适合给别人做离线包或者多台机器统一版本。Install from Local Directory从本地目录安装。配合上一步用就是离线安装的标准姿势。接下来会让你选 Root Directory也就是 Cygwin 的根目录/对应到 Windows 的哪个路径。这里有两个硬性建议路径要短且不要有空格和中文。比如C:\cygwin64就很好。为什么因为大量 Unix 源码和构建脚本在处理路径时对空格、非 ASCII 字符的支持一言难尽一个空格能让configure脚本检查半天。这不是 Cygwin 的缺陷是 Unix 生态的历史包袱绕开它比对抗它划算。3.2 包选择策略一次装对少返工包选择界面是新手最容易翻车的地方因为列表长得让人想直接点下一步。默认的 Base 分类已经包含 bash、coreutils、/usr/bin下的基本命令能保证系统可用但不够干活。我的建议是第一次安装就把常用的一套带上省得后面反复重跑安装器。在搜索框里可以直接敲包名它支持正则比如输入^gcc会列出所有以 gcc 开头的包。下面是我按用途整理的推荐清单用途推荐包基础增强nanovimlesstreedos2unixunzipzip网络传输wgetcurlopensshrsync构建编译makecmakegcc-coregcc-ggdbpkg-config脚本运行python3perlbash-completion版本控制gitsubversion老项目还在用终端复用screentmux系统诊断procpspsmiscsysvinitrebase装的时候别贪尤其别一上来就全选。Cygwin 有上万个包全装下来几十 GB而且很多包会互相引入依赖最后你根本不知道自己装了什么。原则是**先装你确定要用的缺什么补什么。**重跑安装器补齐单个包只需要一两分钟。命令行方式也支持一次性指定包名适合做批量部署脚本setup-x86_64.exe -q -P git,gcc-core,make,cmake,python3,rsync,curl,wget,nano,tmux其中-q是静默模式-P后面跟逗号分隔的包名列表。这个写法在做新机器环境初始化时特别省事可以固化成一份脚本。3.3 家目录、环境变量与终端配置装完之后你的家目录在C:\cygwin64\home\你的用户名在 Cygwin 里显示为/home/你的用户名。强烈建议把日常脚本和项目放在这个家目录或者 Cygwin 根目录下面原因后面第 5 章讲性能时会详细说。环境变量配置走标准的 Unix 流程~/.bash_profile处理登录 shell~/.bashrc处理交互式 shell~/.inputrc管按键行为。一个常见的坑是很多人习惯把 Windows 的 PATH 大量塞进 Cygwin 的 PATH结果find、sort、more这几个命令被 Windows 版本抢走了行为完全不对。Cygwin 默认把/usr/local/bin:/usr/bin放在前面Windows 路径放后面这是有意为之不要随意打乱这个顺序。终端方面新版默认用的是mintty配置文件在~/.minttyrc。它比传统的 Windows 控制台好用得多支持 UTF-8、真彩色、鼠标选择、拖拽调整大小。几个我觉得值得改的项设置合适的字体和字号、把滚动缓冲调大、开启CopyOnSelect、配置一个顺手的快捷键打开新窗口。3.4 验收跑几条命令确认环境没瘸装完别急着干活先做一组体检这能提前暴露 80% 的配置问题uname -a # 应该显示类似 CYGWIN_NT-10.0-22631 的标识 cygcheck -c # 检查已安装包的完整性有没有文件缺失 gcc --version # 编译器是否可用 locale -a | grep -i zh # 中文 locale 是否存在 echo $PATH # 确认 /usr/bin 在最前面uname -a的输出是判断你在哪个环境里最直接的方式出现CYGWIN_NT就说明你在 Cygwin 里出现Linux才是真 Linux 内核。这个命令在你需要写跨平台脚本、做环境判断时非常有用。cygcheck -c会逐个校验文件是否齐全如果输出里有Incomplete说明某个包下载中断了重跑安装器补一下就好。4. Cygwin 怎么用命令迁移、编译构建与互操作4.1 Linux 常用命令在这里基本通用但有几处不一样好消息是你脑子里那套 Linux 命令在 Cygwin 里绝大多数都能直接用ls -la、grep -rn、sed -i、awk、find -exec、xargs、tar -xzf、ssh、scp、rsync、crontab全都在参数语义也一致。写 Bash 脚本时那套set -euo pipefail、trap、数组、进程替换一样能用。需要留心的地方主要有三类。一类是路径格式Windows 盘符在这里表现为/cygdrive/c/所以C:\Windows\System32对应/cygdrive/c/Windows/System32。一类是设备与内核接口/proc和/dev是模拟的/dev/sda这种块设备不存在df -h输出的也是 Windows 卷的视图。一类是权限语义chmod能改但底层映射到 Windows ACL 上效果有限第 5 章会展开。如果你要做环境判断这段写法可以直接抄case $(uname -s) in CYGWIN*|MINGW*|MSYS*) PLATFORMcygwin ;; Linux*) PLATFORMlinux ;; Darwin*) PLATFORMmacos ;; *) PLATFORMunknown ;; esac4.2 让 Makefile 和 shell 脚本跑起来Cygwin 最实际的用途之一就是把一个原本只在 Unix 上构建的项目跑通。多数情况下你只需要三步装齐依赖包、跑./configure、跑make。./configure在执行时会通过config.guess探测平台在 Cygwin 上得到的是类似x86_64-pc-cygwin的标识然后按这个平台去匹配编译规则。这里面有一个必须提前想清楚的问题你要产出什么形态的可执行文件如果编译目标是我自己在这台机器上跑那 Cygwin 工具链没问题产出的程序依赖cygwin1.dll在这台机器上跑得好好的。如果要分发给别人别人没装 Cygwin那产出物就会缺 DLL 跑不起来。这种情况要么把cygwin1.dll一起打包要么改用 MinGW-w64 工具链重新编译成原生程序。如果项目里有大量fork密集的测试用例做好心理准备跑起来会比 Linux 慢必要时可以把测试拆小或者改用spawn风格的写法。一个实用技巧如果构建脚本里用了 Linux 专有的命令比如某些 GNU 扩展参数而 Cygwin 的版本略旧可以优先通过安装器升级对应包而不是去改脚本。Cygwin 的 GNU 工具版本通常比主流 Linux 发行版还新反而不容易出问题。4.3 Windows 与 Cygwin 的边界路径、进程、参数这是 Cygwin 相比 WSL 最有优势的地方——两边的工具可以互相调用前提是你知道怎么转换格式。核心工具是cygpath它专门干路径格式互转这件事cygpath -w /home/me/project # 输出 C:\cygwin64\home\me\project cygpath -u C:\Users\me\data # 输出 /cygdrive/c/Users/me/data cygpath -m /home/me/project # 输出 C:/cygwin64/home/me/project混搭格式 cygpath -w -p $PATH # 把整个 PATH 转成 Windows 分号分隔格式其中-m这个混合格式特别有用因为相当一部分 Windows 程序能接受正斜杠路径同时又需要盘符-m正好满足。你在脚本里调用 Windows 工具时养成路径参数先过一遍 cygpath的习惯能省掉大量文件找不到的排查时间。进程互操作方面Cygwin 里可以直接执行.exeWindows 里也可以调用 Cygwin 的bash.exe。但这里有个高频坑当你在 Cygwin 的终端里运行一个交互式的 Windows 程序典型的是 Windows 版 Python 的交互式解释器、或者某些需要读取键盘的程序会出现没有回显、方向键乱码、CtrlC 失灵的问题。原因是 Windows 老式控制台程序和 mintty 使用的伪终端机制不兼容。解决办法是加一层winptywinpty python.exe反过来如果你要在 VSCode 里把 Cygwin 的 bash 设为默认终端只需要在设置里指定C:\cygwin64\bin\bash.exe加上-l参数让它以登录 shell 方式启动这样环境变量才会正确加载。这个小配置能让整个编辑器的终端体验直接统一到 Unix 习惯上。4.4 把 sshd、rsync 这类常驻服务跑起来Cygwin 不只是个交互式终端它能跑后台服务。方式是借助cygrunsrv把 Cygwin 程序注册成 Windows 服务这样开机自启、后台运行、任务管理器可见完全融入 Windows 的服务体系。以 SSH 服务为例流程大致是这样ssh-host-config # 交互式生成主机密钥和配置文件 cygrunsrv -S sshd # 启动 sshd 服务 cygrunsrv -Q sshd # 查询服务状态配置过程中它会问你要不要用单独的用户账号来跑服务对应 Unix 里的特权分离我的建议是选是安全性更好。配置完之后记得在 Windows 防火墙里放行对应端口否则本地能连、外部连不上这个排查起来很费时间。类似的还有cron定时任务、rsync文件同步服务、inetd这一类。cron特别值得一装因为它让你能在 Windows 上继续用熟悉的 crontab 语法管理定时任务比 Windows 自带的计划任务配置起来直观得多。需要注意的是Cygwin 服务必须有对应工具支撑不能随便把一个前台程序服务化cygrunsrv要求程序本身能正确处理信号和守护进程化。5. 踩坑实录换行符、权限、乱码、性能5.1 CRLF 与挂载模式换行符问题曾经是 Cygwin 的头号坑。Windows 文本文件用 CRLF 结尾Unix 用 LF早期 Cygwin 默认把所有文件系统按文本模式挂载读取时自动把 CRLF 转成 LF写回时再转回去。这个贴心设计在遇到二进制文件时是灾难因为二进制里的0x0D 0x0A会被静默改写文件损坏。现在的情况好多了Cygwin 自从 1.7 之后默认全部走二进制模式不再自动转换。但遗留问题依然存在于两个地方一是Git 的core.autocrlf配置它会按自己的规则转换换行符和 Cygwin 没关系容易让人误判二是老项目里手工配过text挂载选项如果你在/etc/fstab里看到类似text的关键字那就是历史遗留。排查和修复的工具很简单file命令看文件类型dos2unix和unix2dos做转换mount -m可以把当前挂载配置导出成 fstab 格式方便检查。挂载配置直接编辑/etc/fstab即可格式和 Linux 类似但字段含义有差异改之前先备份。5.2 POSIX 权限与用户身份Cygwin 有一套 POSIX 权限模型但底层落地在 Windows ACL 上。chmod 755看起来执行成功了ls -l也显示rwxr-xr-x实际上 Windows 那边的 ACL 可能并没有完全按你想的方式变化。这带来两个后果一是权限控制不要指望它像 Linux 那样可靠涉及安全的场景还是要靠 Windows 侧的 ACL 配置二是开启 ACL 映射会让文件操作变慢。对性能敏感的场景可以在挂载时加noacl选项关掉 ACL 映射文件操作速度会有可感知的提升代价是权限位不再有意义。这个权衡在纯编译构建的场景里通常值得做。用户身份方面/etc/passwd和/etc/group决定了 uid/gid 映射。默认情况下 Cygwin 会自动生成这些文件普通使用完全够。如果你在域环境里想让ls -l正确显示域账户的属主需要手动生成mkpasswd -d -l /etc/passwd # 域用户加本地用户 mkgroup -d -l /etc/group改这两个文件之后之前创建的文件属主显示会变化这是正常现象因为 uid 映射变了。别慌文件本身没动。5.3 中文乱码与 locale中文乱码是另一个高频问题但原因通常不在 Cygwin 本身而在编码不统一。情况分几种Cygwin 自己的程序bash、ls、git默认走 UTF-8只要LANG设置正确就没问题而 Windows 控制台程序输出的中文通常是 GBK在 mintty 的 UTF-8 环境里就会显示成乱码。处理思路是分而治之在~/.bashrc里明确设置export LANGzh_CN.UTF-8如果系统里没有这个 locale先用locale -a确认缺了就通过安装器补语言包。mintty 保持默认的 UTF-8 编码不要改成 GBK否则 Cygwin 自己的程序反而乱。调用 Windows 命令时如果输出乱码可以在命令前临时切码页或者干脆用winpty包一层。文件名里的中文在/cygdrive下一般没问题但如果脚本里做了字符串截取、正则匹配要注意按字符还是按字节处理这是个经典的翻车点。我在实际处理时的惯用做法是**先把所有东西统一到 UTF-8只在必须调用 Windows 老程序时才做临时转换。**统一编码比到处打补丁省事得多。5.4 性能、杀毒软件与 DLL 冲突性能方面有三类原因理解它们能帮你快速定位问题。第一类是fork开销前面讲过进程内存越大fork越慢。诊断方法是观察是不是某类脚本、某个测试框架特别慢而不是所有操作都慢。第二类是文件 IO尤其是对/cygdrive下 Windows 路径的密集小文件读写。原因是每次访问都要做路径转换和权限检查。有个很实用的经验**把项目从/cygdrive/d/...挪到/home/你的用户名/...下面构建速度经常能有明显改善。**代价是文件在 Windows 侧的访问路径变了需要两边都习惯一下。第三类是被外部干扰最典型的是杀毒软件的实时扫描。C:\cygwin64目录下有几万个文件每次编译都会新建大量临时文件杀毒软件逐个扫描一遍速度直接砍半。把 Cygwin 的安装目录和项目目录加进杀毒软件的白名单这一条几乎每次都能立竿见影。还有一个经典报错值得单独拎出来fork: Resource temporarily unavailable。这通常不是内存不足而是 DLL 基址冲突导致的。Windows 的地址空间随机化会让多个 Cygwin DLL 加载到冲突的地址上解决方案是用自带的重定位工具/usr/bin/rebaseall -v执行前要关掉所有 Cygwin 进程包括服务、终端窗口、编辑器里跑着的 shell否则会失败。这是我在 Windows 上装完 Cygwin 后必做的一步能预防后面莫名其妙的随机失败。6. 常见问题速查、升级与卸载6.1 高频问题速查表下面这张表是我这些年攒下来的遇到问题先扫一眼能省不少搜索时间。现象大概率原因处理方式找不到 cygwin1.dll环境变量 PATH 没包含/usr/bin的 Windows 路径或 DLL 被删检查 PATH重跑安装器修复fork报资源不可用DLL 基址冲突关闭所有 Cygwin 进程后执行rebaseall命令行为和 Linux 不一样被 Windows 同名程序抢了检查 PATH 顺序把/usr/bin放前面中文显示成问号或方块locale 未设置或终端编码不对设置LANGmintty 保持 UTF-8交互式 Windows 程序无回显伪终端不兼容前面加winpty编译产物缺少依赖用了 Cygwin 工具链产出非原生程序改用 MinGW 工具链或一起打包 DLL构建很慢文件在/cygdrive下加杀毒扫描挪到家目录加白名单文件权限改了没效果POSIX 权限映射到 Windows ACL关键场景改用 Windows ACL或挂载加noacl安装器报下载失败镜像源不稳定换镜像源重试或用离线安装模式服务启动失败端口占用或权限不足查cygrunsrv -Q检查防火墙和端口6.2 升级、备份与彻底卸载升级很简单重新运行setup-x86_64.exe选同一个 Root Directory它会自动读取已安装包列表你在包列表里点一下右上角的版本号就能在保持/升级/重装/卸载之间切换。升级前建议先备份/etc和/home因为配置文件是手改的还是默认生成的安装器分不清覆盖了就找不回来。彻底卸载分三步只删目录是不够的第一步用安装器把所有服务停掉并卸载cygrunsrv -R 服务名第二步删除C:\cygwin64整个目录第三步清理注册表里HKEY_LOCAL_MACHINE\SOFTWARE\Cygwin和HKEY_CURRENT_USER\Software\Cygwin下的键值以及环境变量里可能存在的CYGWIN项。不做后两步重装时可能因为残留配置出现奇怪的问题。如果你想同时保留多个 Cygwin 环境比如一个稳定版做日常、一个装一堆实验包的沙箱完全可以装到不同目录它们互不干扰。只是要注意每个环境有自己的cygwin1.dll跨环境调用程序时容易混淆尽量在脚本里写绝对路径。6.3 我个人的实践体会用了这么多年我给自己总结出几条使用原则也分享给你。**第一条把 Cygwin 定位成工具而不是环境。**它最舒服的用法是Windows 那边继续用你习惯的编辑器和图形工具Cygwin 这边负责跑脚本、做构建、管服务器、写批处理。别想着把所有事情都搬进 Cygwin那样反而别扭。真正体现它价值的地方是让两边各干各擅长的事。**第二条能装包解决的绝不改脚本。**很多人遇到命令参数不支持第一反应是改脚本去适配结果脚本在真 Linux 上又跑不通了。Cygwin 的 GNU 工具版本通常很新缺什么装什么把脚本的跨平台一致性保住价值比省那几分钟大得多。**第三条遇到莫名问题先做两件事跑一遍rebaseall检查一遍 PATH。**这两个检查花不了一分钟却解决了我和同事遇到的一大半疑难杂症。尤其是从别人手里接过来的机器PATH 里塞了一堆乱七八糟的路径跑什么命令都感觉不对劲理一遍就好了。**第四条项目目录尽量放在 Cygwin 家目录下。**我知道把代码放在D:\work\项目更符合 Windows 使用习惯但慢是真的慢。折中方案是在家目录下建软链接或者干脆两边同步。这个取舍做过一次之后你会自己有答案。最后再说个容易被忽略的细节Cygwin 里的crontab跑任务时环境变量和你在交互式终端里完全不一样PATH 短得可怜LANG也是空的。写定时任务时脚本开头手动补上 PATH 和 locale 设置比在报错之后查半天要划算得多。这个坑我踩过不止一次现在写任何定时脚本前两行必定是环境变量定义。
返回列表