为何Python生成的Shell脚本提示无法执行二进制文件,复制后却可运行?
PowerShell生成的Shell脚本无法执行,复制后却正常的原因及解决办法
问题重现
- 在PowerShell中通过Python脚本生成Shell脚本:
python generate_large_local_array_run.py > large_local_array_run.sh
- 尝试用bash运行脚本时报错:
bash large_local_array_run.sh large_local_array_run.sh: bash large_local_array_run.sh: cannot execute binary file
- 将原脚本内容复制到新文件
temp.sh后,执行bash temp.sh却能正常运行。
核心原因:文件编码与格式差异
- 编码问题(主要原因):PowerShell的默认重定向
>会生成**UTF-16 LE(带BOM)**编码的文件,而bash等类Unix Shell仅识别UTF-8(无BOM)或ASCII编码的文本脚本。UTF-16编码的文件会被bash判定为二进制文件,从而触发"cannot execute binary file"错误。 - 换行符差异(次要因素):Windows系统换行符为
\r\n,Unix系统为\n,你复制内容到新文件时,编辑器或系统可能自动转换了换行格式,但这不是导致二进制错误的核心原因。
解决办法
1. 生成时直接指定UTF-8编码
方法一:修改Python脚本
在Python脚本中指定标准输出为UTF-8编码:
import sys # 重新配置标准输出为UTF-8(无BOM) sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf-8', buffering=1) # 后续正常输出脚本内容
方法二:用PowerShell命令指定编码
放弃默认重定向,改用Out-File指定编码:
python generate_large_local_array_run.py | Out-File -Encoding utf8 large_local_array_run.sh
2. 转换现有错误编码的脚本
在WSL Ubuntu中转换:
iconv -f UTF-16LE -t UTF-8 large_local_array_run.sh > fixed_script.sh
在PowerShell中转换:
Get-Content large_local_array_run.sh | Set-Content -Encoding utf8 fixed_script.sh
内容的提问来源于stack exchange,提问作者Ammiba
相关产品推荐
相关产品推荐

