Bash 无法从命令行执行

Bash 无法从命令行执行

描述:

我无法bash从桌面打开的命令行执行。我必须cd运行system32它。

错误信息:

‘bash’ 不被识别为内部或外部命令,也不是
可运行的程序或批处理文件。

预期成绩:

bash输入后cmd,Windows Subsystem for Linux 将在当前目录中打开。

额外的:

我已经启用了适用于 Linux 的 Windows 子系统,bashUbuntu 应用程序运行良好。我认为存在问题PATH,但不确定如何解决。

Windows 开发人员模式已启用。旧版控制台未选中。

系统环境变量及其值:

ComSpec                  C:\Windows\system32\cmd.exe
DriverData               C:\Windows\System32\Drivers\DriverData
NUMBER OF_PROCESSORS     8
OS                       Windows_NT
Path                     C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin;C:\Pr...
PATHEXT                  .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE   AMD64
PROCESSOR_IDENTIFIER     Intel64 Family 6 Model 142 Stepping 12, GenuineIntel
PROCESSOR_LEVEL          6
PROCESSOR_REVISION       8e0c
PSModulePath             %ProgramFiles%\WindowsPowerShell\Modules;C:\Windows\s...
TEMP                     C:\Windows\TEMP
TMP                      C:\Windows\TEMP
USERNAME                 SYSTEM
windir                   C:\Windows

System32 中的搜索结果

bash.exe.mui                                    Date modified: 2020-07-03 7:33 PM
C:\Windows\System32\en-US   Type: MUI File      Size: 4.50 KB

bash.exe                                        Date modified: 2020-01-01 10:10 PM
C:\Windows\System32         Type: Application   Size: 118 KB

答案1

适用于 Linux 的 Windows 子系统

目前使用Windows 10 1903根据 Windows 更新历史记录。我的第一个建议是升级到目前最新的 Windows 10,Windows 10 2004使用 Microsoft 页面下载 Windows 10如果可能的话。适用于 Linux 的 Windows 子系统(WSL)就像介绍适用于 Linux 的 Windows 子系统2例如可以在维基百科页面上看到Windows 10 版本历史记录为了版本 2004(2020 年 5 月更新)。 这Windows 开发人员模式在开始 Windows 10 升级之前应将其禁用。


错误原因

错误是由于在 中启动了 32 位 Windows 命令处理器%SystemRoot%\SysWOW64\cmd.exe而不是 中的 64 位版本而导致的%SystemRoot%\System\cmd.exe。因此,Windows文件系统重定向器当 32 位 Windows 命令处理器C:\Windows\System32当地的环境变量来搜索具有以下文件扩展PATH名的文件:bash当地的环境变量PATEXT导致在目录中搜索C:\Windows\SysWOW64bash但是 Windows 系统目录中没有bash.exe32 位应用程序。因此bash.exe32 位 找不到cmd.exe

请阅读 Stack Overflow“X 不是内部或外部命令,也不是可运行程序或批处理文件”是什么原因?cmd.exe有关如何使用PATH以及PATHEXT用户如何配置这两个非常重要的环境变量的更多详细信息。


解决方案 1:使用 64 位 Windows 命令处理器

第一个解决方案是打开 64 位命令提示符通过启动%SystemRoot%\System\cmd.exe而不是%SystemRoot%\SysWOW64\cmd.exe在 64 位 Windows 上启动。

这绝对是最好且最容易实现的解决方案。


解决方案 2:使用完整限定文件名运行 BASH

第二种解决方案是bash从 32 位命令提示符窗口内运行,使用特殊别名使用完整限定文件名,Sysnative这意味着键入C:\Windows\Sysnative\bash.exe而不是仅仅输入bash

另请参阅 Microsoft 文档命名文件、路径和命名空间

这绝对是使用 32 位 Windows 环境的最佳解决方案。


解决方案 3:硬链接到 bash.exe

注意力:不建议长期使用此解决方案!

第三种解决方案是以%SystemRoot%\SysWOW64\cmd.exe管理员身份启动,在 Windows 文件资源管理器中使用鼠标辅助按钮(右键)单击此文件,然后单击上下文菜单项以管理员身份运行以本地管理员的提升权限明确启动 32 位 Windows 命令处理器。

接下来输入以下命令行:

mklink /H %SystemRoot%\SysWOW64\bash.exe %SystemRoot%\Sysnative\bash.exe

这将创建一个硬链接,其名称为 目录中bash.exe的文件。然后 32 位应用程序可以找到 中的文件,从而导致64 位应用程序在 Windows 系统目录中执行。%SystemRoot%\SysWOW64bash.exe%SystemRoot%\Sysnativecmd.exebash.exe%SystemRoot%\SysWOW64%SystemRoot%\System32\bash.exe

在命令提示符窗口中运行mklink /?以获取有关此命令的帮助,或阅读更好的 SS64 文档明科互联

笔记:建议删除del %SystemRoot%\SysWOW64\bash.exe在命令提示符窗口中执行的硬链接以管理员身份运行在进行 Windows 更新或 Windows 升级之前,在通过 Windows 更新/升级安装%SystemRoot%\System32\bash.exe新版本后更新并重新创建硬链接。bash.exe

我不建议使用这个解决方案,因为它很容易在将来引起麻烦。


解决方案 4:创建 bash.cmd

注意力:为了与包含的批处理文件兼容,不建议使用此解决方案bash

第四种解决方案是以%SystemRoot%\SysWOW64\cmd.exe管理员身份启动,在 Windows 文件资源管理器中使用鼠标辅助按钮(右键)单击此文件,然后单击上下文菜单项以管理员身份运行以本地管理员的提升权限明确启动 32 位 Windows 命令处理器。

接下来输入以下命令行:

echo @%SystemRoot%\Sysnative\bash.exe %*>%SystemRoot%\SysWOW64\bash.cmd

该命令行使用单个命令行在C:\Windows批处理文件中创建并安装 Windows :C:\Windows\SysWOW64\bash.cmd

@C:\Windows\Sysnative\bash.exe %*

因此,32 位cmd.exe现在可以bash在 32 位 Windows 命令提示符窗口中输入文件,bash.cmd使用%SystemRoot%\SysWOW64目录路径C:\Windows\System32当地的环境变量PATH由文件系统重定向器重定向到C:\Windows\SysWOW64。批处理文件运行C:\Windows\System32\bash.exe时将启动时指定的所有参数传递bash.cmd给 bash.exe

笔记:包含刚刚bash由 32 位 Windows 命令处理器执行的 Windows 批处理文件导致通过 启动bash.exebash.cmd但随后不再通过 执行批处理文件中的命令行,cmd.exe因为 Windows 命令处理器在完成执行后结束批处理文件执行,bash.cmd而无需使用命令执行称呼bash来自最初执行的批处理文件。因此,对于仅包含32 位执行的文件名的批处理文件,此解决方案并不安全cmd.exe

我不建议使用此解决方案,因为它可能会导致批处理文件出现问题。


结论

肯定还有更多的解决方案,但最好的是在 64 位 Windows 上运行 64 位 Windows 命令处理器,以便不受限制地访问从 Linux 移植的所有可执行文件,并默认与 Windows 10 一起安装,bash.exe或目录中的可执行文件%SystemRoot%\System32\OpenSSH也仅作为 64 位可执行文件存在。

答案2

错误原因

存在一个错误,即 Windows 认为旧式控制台已被激活,但实际上它并未被选中。

解决方案

脚步:

  1. 打开命令提示符
  2. 右键单击顶部栏,然后按特性
  3. 转到选项选项卡,然后选中旧版控制台
  4. 重新启动命令提示符
  5. 返回选项选项卡,取消选中旧版控制台
  6. 重新启动
  7. Windows BUG:命令提示符很可能是一个没有文本的黑框
  8. 转到“属性”,然后转到“终端”选项卡
  9. 取消选中Use separate foreground并“使用单独背景”
  10. 现在输入bashcmd 并且它应该可以正常工作。

相关内容