Bash脚本重定向输出到文件时出现乱码的问题排查
问题分析与解决办法
这种情况我之前碰到过好几次,大概率是脚本文件本身的格式问题在搞鬼,给你拆解两个最常见的原因和对应的解决办法:
1. 脚本的换行符格式不兼容(最常见)
如果你是在Windows环境下用Notepad或者记事本编辑的Bash脚本,默认会保存成Windows风格的CRLF换行符(也就是\r\n),但Linux/Bash环境只认Unix风格的LF换行符(\n)。当你运行脚本时,Bash会把每行末尾的\r当成普通字符解析,最终写入目标文件时就会带上这个看不见的特殊字符——在Notepad里可能显示成方块,在Vim里会显示成^M。
而你直接把代码复制到Bash里执行时,终端会自动把换行符转换成LF格式,自然就不会有这个问题。
解决办法:
- 用Notepad++打开你的脚本:点击界面右下角的「CRLF」按钮,选择「LF」,然后保存脚本。
- 或者在Bash环境里用命令转换:
# 如果安装了dos2unix工具 dos2unix your_script.sh # 没有dos2unix的话用sed替代 sed -i 's/\r$//' your_script.sh
2. 脚本带UTF-8 BOM头
有些Windows编辑器(比如系统自带的记事本)保存UTF-8文件时,会自动加上一个BOM头(三个不可见的字节:EF BB BF)。Bash执行脚本时会把这三个字节当成脚本内容的一部分,最终输出到目标文件里就会出现奇怪的开头字符。
解决办法:
- 用Notepad++打开脚本:顶部菜单选择「编码」→「UTF-8无BOM」,然后保存。
- 或者在Bash里用命令去掉BOM头:
sed -i '1s/^\xEF\xBB\xBF//' your_script.sh
改完上面的格式问题后,再运行脚本试试,生成的文件应该就和你直接复制代码执行的结果一致了。
内容的提问来源于stack exchange,提问作者atapaka
相关产品推荐
相关产品推荐

