You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python生成的Shell脚本提示无法执行二进制文件,复制后却可运行?

PowerShell生成的Shell脚本无法执行,复制后却正常的原因及解决办法

问题重现

  1. 在PowerShell中通过Python脚本生成Shell脚本:
python generate_large_local_array_run.py > large_local_array_run.sh
  1. 尝试用bash运行脚本时报错:
bash large_local_array_run.sh
large_local_array_run.sh: bash large_local_array_run.sh: cannot execute binary file
  1. 将原脚本内容复制到新文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:17:26