前两天有人拿段shell脚本问我,bash死活报"syntax error near unexpected token",可#!/bin/sh明明写得规规矩矩。我让她hexdump看眼,首字节是ef bb bf,也就是UTF-8的BOM。
说起来BOM(\uFEFF)本是为UTF-16标记字节序设计,跟UTF-8其实没关系。可Windows记事本存UTF-8时,常顺手把这三个字节塞到文件头。麻烦在于多数解析器不认它:bash把首行读成"\ufeff#!/bin/sh",Python解释器也直接拒收。于是语法错误凭空冒出来,还肉眼难见,vim里:set list都不一定显形。
从某种角度看,这是编码规范和使用习惯长期没对齐的约定。排查倒简单,hexdump -C看头三字节,或vi -b打开即可。根子上统一用无BOM的UTF