关于Linux Shell脚本能否使用带BOM的UTF-16格式的技术咨询
关于Linux Shell脚本能否使用带BOM的UTF-16格式的技术咨询
嗨,我来帮你梳理这个问题~
首先直接给结论:大多数Linux shell(比如你用的bash)默认是不支持直接执行UTF-16编码(不管带不带BOM)的脚本的,这也是你遇到-bash: ./test-unicode.sh: cannot execute binary file错误的核心原因——shell把UTF-16的双字节流当成了二进制数据,根本识别不出这是可解析的脚本文本。
为啥会这样?简单说,shell脚本的执行逻辑是靠开头的shebang(比如#!/bin/bash)来触发对应的解释器,但bash这类解释器默认只认UTF-8或者ASCII这类单字节编码。UTF-16里,#!这两个字符会变成四个字节(比如UTF-16LE下是0x23 0x00 0x21 0x00),解释器完全看不懂这是脚本的起始标记,自然就把整个文件当成二进制处理了。
那你想在注释里加入特殊Unicode字符的需求怎么满足?其实不用纠结UTF-16,给你两个实用方案:
- 首选方案:把脚本保存为UTF-8编码(推荐不带BOM,因为少数shell对UTF-8 BOM会有兼容性问题)。UTF-8完全支持所有Unicode字符,你想加的那些原本用UTF-16表示的字符,转成UTF-8后一样能正常显示,而且shell可以毫无障碍地解析脚本,完美解决需求。
- 备选方案(不推荐日常用):如果非要保留UTF-16编码,那得先转码再执行,比如用
iconv工具转成UTF-8后交给bash处理:
注意这里要指定正确的UTF-16字节序(LE小端或BE大端),不然转码会乱码。iconv -f UTF-16LE -t UTF-8 ./test-unicode.sh | bash
总结一下:别用UTF-16写shell脚本,换成UTF-8是最省心的选择,既能满足注释里加特殊字符的需求,又不会触发执行错误。
备注:内容来源于stack exchange,提问作者alancc
相关产品推荐
相关产品推荐

