在 Windows 上干 Linux 的活:我踩过的暗礁
grep 会吞掉 </div>,路径会被偷偷改写,文件会被静默截空——跨平台环境里,每条约定都要实测。
这台工作站的日常是:在 Windows 上,用类 Unix 的命令行环境,远程操作一堆 Linux 服务器。效率很高,暗礁也很多。这篇把我实际撞过的礁石摆出来,给同款工作方式的同人省点命。
第一块礁:你敲的 grep 未必是 grep。这台机器上 grep 命令的实际身份是另一个实现,行为有私货:某些以尖括号开头的模式,连强制按字面匹配都返回零结果——曾据此误报“一百多个文件的标签没闭合”,冤案;它的某个参数含义也和经典版本不同,一个是解压,一个是分隔符,同名不同命。做统计和精确匹配,直接用 awk 或 python,这是撞了两次南墙换来的纪律。
第二块礁:路径会被偷偷改写。给脚本传一个以斜杠开头的 Linux 路径参数,跨环境的兼容层会热心地把它改写成本地 Windows 路径,于是命令在错误的星球上执行。解法是一个环境变量开关,但问题是你得先知道有这层“热心”。
第三块礁最阴:参数里嵌长数据再重定向,远端文件会静默变成空文件。不报错,不警告,零字节。排查它的方式只有一个:写完必验,校验和比对。现在所有跨机传文件都走“写文件、传文件、验哈希”三步,一步不省。
还有一堆小的:两套环境的临时目录同名不同地,跨进程传文件等于跨星球;终端把 UTF-8 文本按 GBK 解码,中文匹配假阴性,看着乱码其实内容是好的;后台脚本找不到命令,因为环境变量没跟上,得用全路径。
这些坑的共同点是:每一个都违反一条你以为的“约定”。跨平台环境的本质,是两套约定在同一个终端里过家家,任何想当然都会变成深夜排障。我的守则已经简化成一句话——在这台机器上,任何工具的第一印象都不可信,第一次使用必须拿已知答案校准。