为何bash脚本emsdk能在Windows系统正常运行?
为什么Windows的CMD和PowerShell能直接运行emsdk bash脚本?
按照emsdk官方安装指引,Windows用户应该运行emsdk.bat而非直接执行./emsdk bash脚本,但实际操作中,我在PowerShell 7和CMD里直接运行emsdk install latest都能正常完成安装:
PowerShell执行日志
PS C:\Intermediate\Projects\emsdk> .\emsdk install latest Resolving SDK alias 'latest' to '3.1.47' Resolving SDK version '3.1.47' to 'sdk-releases-39ade279e75e6d17dd6b7eb9fba2006e61fe966b-64bit' Installing SDK 'sdk-releases-39ade279e75e6d17dd6b7eb9fba2006e61fe966b-64bit'.. Installing tool 'node-16.20.0-64bit'.. Downloading: C:/Intermediate/Projects/emsdk/downloads/node-v16.20.0-win-x64.zip from https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v16.20.0-win-x64.zip, 28623474 Bytes Unpacking 'C:/Intermediate/Projects/emsdk/downloads/node-v16.20.0-win-x64.zip' to 'C:/Intermediate/Projects/emsdk/node/16.20.0_64bit' Done installing tool 'node-16.20.0-64bit'. ...
CMD执行日志
C:\Intermediate\Projects\emsdk>emsdk install latest Resolving SDK alias 'latest' to '3.1.47' Resolving SDK version '3.1.47' to 'sdk-releases-39ade279e75e6d17dd6b7eb9fba2006e61fe966b-64bit' Installing SDK 'sdk-releases-39ade279e75e6d17dd6b7eb9fba2006e61fe966b-64bit'.. Skipped installing node-16.20.0-64bit, already installed. Skipped installing python-3.9.2-nuget-64bit, already installed. Skipped installing java-8.152-64bit, already installed. Skipped installing releases-39ade279e75e6d17dd6b7eb9fba2006e61fe966b-64bit, already installed. All SDK components already installed: 'sdk-releases-39ade279e75e6d17dd6b7eb9fba2006e61fe966b-64bit'.
这看起来很矛盾——毕竟单独在CMD里执行脚本里的bash语法(比如PYTHON3="$(dirname "$0")/python/3.9.2-1_64bit/bin/python3")会直接报错:
C:\Intermediate\Projects\emsdk>PYTHON3="$(dirname "$0")/python/3.9.2-1_64bit/bin/python3" 'PYTHON3' is not recognized as an internal or external command, operable program or batch file.
原因解析
emsdk脚本本身是跨环境兼容的智能脚本,它的开头包含环境检测逻辑:
- 当系统中存在bash解释器(比如Git Bash、WSL自带的bash),执行
emsdk时会启动bash来解析脚本。 - bash执行脚本时,会先检查当前是否处于Windows环境(通过判断
WINDIR环境变量是否存在)。 - 一旦检测到是Windows环境,脚本会自动调用同目录下的
emsdk.bat,并把所有传入的参数(比如install latest)传递给批处理脚本。
也就是说,你看似在执行bash脚本,实际是bash解释器帮你转调了官方推荐的emsdk.bat,所以能正常完成安装。
为什么部分用户会执行失败?
如果系统中没有安装bash解释器(比如没装Git for Windows、WSL等),Windows无法识别emsdk文件的执行方式,就会出现无法运行的报错——这也是官方指引里明确要求Windows用户直接运行emsdk.bat的原因,避免依赖bash环境。
内容的提问来源于stack exchange,提问作者Methodox Charles Zhang
相关产品推荐
相关产品推荐

