三类常见问题
第一类换行符:Windows 使用回车加换行,Linux 只使用换行,带回车换行的脚本在 Linux 上执行时,解释器会把回车当成命令的一部分,报出难以理解的错误,例如提示找不到某命令但命令看起来很正常。第二类编码与 BOM:带字节顺序标记的 UTF-8 文件在部分解释器与配置解析中会在开头混入不可见字符,导致第一行语法错误。第三类字符集:脚本里含中文提示或路径时,若文件编码与运行环境不一致,会出现乱码、字符串比较失效甚至截断。
基本信息
| 推荐编码 | 无 BOM 的 UTF-8 |
|---|---|
| 换行约定 | 跨平台脚本统一使用换行符 |
| 检查时机 | 提交前检查,部署前验证 |
| 常见受影响文件 | shell 脚本、配置文件、清单与模板 |
落地做法
- 统一保存为无 BOM 的 UTF-8,并写入团队约定。
- 在版本控制中固定换行处理,避免有人整文件转换后产生巨大差异。
- 在提交或流水线中加入自动检查,发现换行或 BOM 问题直接失败。
- 脚本中避免使用依赖本地语言的输出解析,必要时固定语言环境。
- 跨平台分发时用明确的转换步骤,而不是手工另存。
- 把编码要求写进模板与脚手架,让新资产默认就是正确的。
检查与修正
检查与修正
# 检查是否含有回车符(Windows 换行)
file ./deploy.sh # 输出中若出现 CRLF 说明换行不符
grep -rlU $'\r' ./scripts || echo 'OK: 未发现回车符' # 批量排查
# 去除回车符并去掉可能的 BOM
sed -i 's/\r$//' ./deploy.sh # 修正换行
sed -i '1s/^\xEF\xBB\xBF//' ./deploy.sh # 去除 UTF-8 BOM 标记
bash -n ./deploy.sh && echo 'OK: 语法通过'问题表现与修正
| 问题 | 典型表现 | 修正方式 |
|---|---|---|
| 带回车换行 | 提示命令或参数不存在 | 转换为单一换行符 |
| 带 BOM 标记 | 首行语法错误或配置解析失败 | 保存为无 BOM 格式 |
| 编码不一致 | 中文乱码、比较失效 | 统一为无 BOM 的 UTF-8 |
| 语言环境不同 | 解析命令输出失败 | 固定语言环境或用机器可读输出 |
| 整文件被转换 | 提交差异巨大且难以评审 | 规范换行处理,避免批量转换 |
把检查做成自动门禁比写进规范更有效:换行与 BOM 问题在编辑器里不可见,人工评审几乎无法发现。
Windows 上运行的脚本如果由其他工具调用,同样要考虑反向问题:只使用换行的批处理文件在 Windows 上可能表现异常,跨平台资产应明确各自的换行要求。