如何在 Windows 上使用类似 Bash 的 shell?

Mic*_*ant 61 windows terminal bash shell bash-alias

我使用 Linux 和 Mac,我很快就会教授一些命令行的东西。

我可以在 Windows 上安装什么来给我一个最类似于基本 Mac/Linux Bash shell 的终端窗口?

如果可能,我也希望能够定义 .bash_aliases。

小智 53

您现在可以安装适用于 LinuxWindows 子系统,它允许您在Windows运行本机用户模式 ​​Linux shell 和工具。这允许您直接在 Windows 上运行Bash shell,并且基于 Ubuntu。

这是在 Windows 10 的周年更新 (2016) 中引入的,默认情况下未启用。要在 Windows 10 周年更新机器上启用新功能,请执行以下操作:

  1. 导航到设置 -> 更新和安全 -> 对于开发人员,然后选择“开发人员模式”
  2. 控制面板 -> 程序和功能,然后单击左上窗格中的“打开或关闭 Windows 功能”
  3. 在对话框中,选中“Windows Subsystem for Linux”,然后单击“确定”
  4. 重启机器
  5. 搜索“bash”并点击它,它应该打开一个命令提示符并询问你是否要安装“Ubuntu on Windows”,继续“y”
  6. 安装后它会要求创建一个 UNIX 用户名和密码
  7. 您现在已准备好使用 bash shell

回顾一下历史,早在 2015 年,Astoria 项目就开始将 Android 应用程序引入 Windows,为此他们构建了一个名为 Windows Subsystem for Linux (WSL) 的 Linux 子系统。最终 Astoria 项目因为破坏了他们的 UWP(通用 Windows 平台)战略而被放弃,但保留了一些部分并形成了 bash for Windows 的基础。在整个过程中,Microsoft 与 Canonical(Ubuntu Linux 的创建者)合作,为他们提供包含所有支持工具/二进制文件的本机映像。

此处提供更多信息,
https
: //blogs.msdn.microsoft.com/commandline/2016/04/06/bash-on-ubuntu-on-windows-download-now-3/ https://blogs.windows.com /buildingapps/2016/03/30/run-bash-on-ubuntu-on-windows/
https://sec.ch9.ms/sessions/build/2016/P488.mp4(视频)


小智 45

您可以安装CygwinMSYS/MinGW,或者您可以在虚拟机中安装完整的 Linux 发行版(例如,使用VirtualBox)。

  • 注意:您现在可以安装“适用于 Linux 的 Windows 子系统”,它允许您在 Windows 上运行本机用户模式 ​​Linux shell 和工具。请看下面的答案... (3认同)

nde*_*mou 29

以下是 2018-05 年可用选项的列表,其中包含截至 2020-01 年有关 WSL 的大量更新以及有关每个选项的一些详细信息。

突出的选项

适用于 Linux 的 Windows 子系统 (WSL)

WSL 变得越来越成熟(微软很久以前就放弃了beta 警告)并且非常容易安装,所以在大多数情况下它是一个非常好的(如果不是最好的)选择。它使用与大多数其他选项不同的方法来解决问题。您运行的二进制代码与在 Linux 系统上运行的二进制代码完全相同。直到 2020-01 WSL 拦截内核调用并将它们转换为 windows 内核调用(想想 Wine 的反面)。这将改变,因为 WSL 的当前测试版在轻量级 VM 中运行真正的 linux 内核。

无论如何,使用 WSL,您确实获得了一个漂亮的 shell,其中包含您希望在库存 Ubuntu 安装中找到的几乎所有 CLI 好东西apt install,以及存储库中几乎所有可用内容的选项。微软官方声明“WSL 不旨在支持 GUI 桌面或应用程序”,但是有关于如何做的非官方说明。从目前的情况来看(2020-01),WSL 的主要缺点如下:

这是与 cygwin一个古老但很好的比较(请注意,Rich Turner 是 WSL 团队的成员,他发布了许多有关 WSL 的有用信息)

CygwinBabun

Cygwin 提供以下内容:

  1. 一个 bash shell 和 Mintty 终端,
  2. 编译为在 Windows 上运行的广泛的常见 Linux 实用程序
  3. 一个全面的兼容层,使 Linux 程序能够在 Windows 上运行。

Cygwin 旨在使在 Windows 上移植 Linux 应用程序变得容易。如果某些 C 程序是为 Unix 设计的,并希望使用管道、Unix 风格的文件和目录访问等功能,那么您可以为 Cygwin 编译它,Cygwin 将充当代码和外部操作系统 (Windows)之间的兼容层. 这允许相同的 C 程序在 Linux 和 Windows 上运行,几乎不需要修改。大量 Linux 程序已经编译完成,可以在安装 Cygwin 时运行。但是,作为这些程序的用户,您可能必须熟悉 Unix。例如,您可能需要传递像/cygdrive/c/autoexec.bat而不是这样的参数,c:\autoexec.bat并准备好用 Unix 行终止 ( \n) 而不是 Windows 行终止 ( \r\n)来处理输出。

所有 Cygwin 程序的集合包含一个存储库,尽管 Cygwin 没有传统的 Linux 包管理器,但您可以随时使用非常反直觉的方式从该存储库中添加、删除和更新程序(您运行 Cygwin 的 setup.exe 在安装完成的任何时间)

Babun是 Cygwin,具有全功能的包管理器 (pact),oh-my-zsh 用于其 shell、git、自动更新和面向插件的架构。尽管默认 shell 是 zsh,但您可以轻松切换到 bash。如果您不介意额外的重量,这似乎是对香草 Cygwin 的不错升级。

Mingw-w64

Mingw-w64 提供以下功能:

  1. 一个 bash 外壳,
  2. 相当数量的 Linux 实用程序,
  3. 一个软件开发工具链,用于构建无需 Linux 兼容层(或最少兼容层)即可运行的应用程序。

MinGW 主要是 Windows 的软件分发和构建平台。特别是它是 GNU 编译器工具的 Windows 端口,例如 GCC、make、bash 等。它包括相当数量的 GNU 工具和最小的 Unix 兼容层。

Mingw-w64 和 Cygwin 的主要区别在于优先级:Cygwin 旨在提供一个完整的 POSIX 兼容层,包括所有主要 Unix 系统调用和库的完整实现;性能次于兼容性。MinGW 的目标是性能,因此它不会提供某些在 Windows 下无法轻松和/或足够快地实现的 POSIX API。MinGW 的主要目标也是软件开发人员。尽管如此,临时用户也可能会喜欢它的外壳和通用的实用程序。

适用于 Windows 的MSYS2Git

MSYS2 提供以下内容:

  1. 一个 bash shell 和 Mintty 终端,
  2. 相当数量的 Linux 实用程序,
  3. 用于安装操作系统程序的全功能命令行包管理器
  4. 来自 Cygwin 和 MinGW 的部分,以支持构建带有或不带有全面 Linux 兼容层的应用程序。
  5. 一个软件存储库和一个包管理器 (pacman),可以轻松地在 Windows 上安装、使用、构建和移植软件。

MSYS2 也主要是一个软件分发和 Windows 的构建平台,如 MinGW,但它结合了 Cygwin 的方式和 MinGW 的方式。您可以使用 MSYS2 来创建“MinGW 程序”“MSYS2 程序”。稍后链接到 MSYS2 (msys-2.dll) 的兼容层,它本身密切关注 Cygwin 的兼容层开发,并进行了一些添加/修改。然而,这两个项目的存储库是完全不相关的。因此,尽管 MSYS2 和 Cygwin 都提供了grep.exe它们可能具有完全不同的版本。

适用于 Windows 的 Git要么只是安装了 git 的 MSYS2 ,要么至少在很大程度上基于 MSYS2。它提供了相同的 shell (bash)、终端 (Mintty) 和包管理器 (pacman)。它似乎是在 Windows 上运行占主导地位的 Git 的最流行的方法,并且您将获得一个不错的 Unix 环境。

共同点

除了 WSL 之外,上述大多数工具共享许多通用技术(库、可执行文件、概念)。例如,MinGW 附带的 bash shell 依赖于 msys-2.dll,它本身就是 cygwin.dll 的一个分支。所以是的,有很多混乱的空间:-)

更多选择

Cmder只为 Windows 提供了一个很好的终端和一个类似 bash 的 shell。它的主要组件是Conemu(终端)。最重要的是,它添加了Clink,它提供了强大的 Bash 风格的命令行编辑、自定义提示布局和 Monokai 配色方案。它与本机 Windows 控制台程序高度(或完全)兼容。

Scoop为许多著名的跨平台程序(包括许多 GNU 工具)提供了命令行包管理器。它下载预编译的包。它既不提供外壳也不提供终端,而是在 Windows 的 cmd.exe 下运行(具有所有限制,但与本机 Windows 控制台程序完全兼容)。它还不包括编译器套件(但当然编译器和开发工具是您可以使用 scoop 安装的典型包)。Scoop 安装的许多程序要么直接来自 MinGW/MSYS 项目,要么是使用他们的工具构建的。

更多选择

下面的解决方案似乎并不活跃,我从未测试过它们,但它们似乎为其他人完成了这项工作:

Gow (Gnu On Windows) 是 Cygwin 的轻量级替代品,没有外壳。它使用一个方便的 Windows 安装程序,安装大约 130 个非常有用的开源 Linux 应用程序,这些应用程序编译为本地 win32 二进制文件,并通过 windows 的 cmd.exe 提供。它被设计得尽可能小(大约 10 MB)。

UnxUtils & GnuWin32 UnxUtils是通用 GNU 类 Unix 实用程序到本机 Win32 的端口集合,可执行文件仅依赖于 Microsoft C 运行时 msvcrt.dll。您必须下载主要部分和一些更新GnuWin32 的版本高于 UnxUtils,但需要支持文件(例如 DLL)

MSYS & MinGW似乎被MSYS2 & MinGW-W64淘汰,所以我从未看过它们。

Cygwin & MSYS2 上的一些常见问题

关于终端

Mintty 是 Cygwin、MSYS2 及其衍生产品中使用的终端。应该知道,如果您正在运行 Windows 本机控制台程序,它并不是 Windows 命令提示符的轻松替代品。虽然具有简单文本输出的程序通常运行良好,但交互式和全屏程序通常会出现问题。在 Mintty 的主页上阅读更多内容,并阅读Git for Windows FAQ上的条目“一些本机控制台程序在从 Git Bash 运行时不起作用” 。当您遇到此类问题时,该条目有以下建议:

有几种方法可以解决这些问题:

  • 使用winpty实用程序运行有问题的程序。这允许您继续使用更好的 mintty 终端,但如果您需要许多程序的解决方法,则可能会变得笨拙。
  • [使用 cmd.exe] 并配置为“快速编辑”、合理的大小和回滚以及合适的 unicode 字体。您仍然必须忍受 [cmd.exe] 的其他怪癖。
  • 安装和使用Conemu

其他事宜

要记住的两个最重要的事情是:

  1. 在功率和难以调试的问题之间存在权衡。解决方案越强大,即使在最初看起来与您的 Linux 层无关的方式上,也会出现更多问题。

  2. 如果您没有足够的 Linux 经验,请不要使用更强大的解决方案,例如 Cygwin/MSYS2/MinGW

UnxUtils 和 GnuWin32 的功能最弱,但也最不容易引起您的头痛。Cygwin 和类似的东西在功率和头痛方面都名列前茅。Cmder 处于中间位置。因此,当您需要最强大的解决方案时,请睡个好觉并全神贯注。在测试新的和可能不稳定的东西时避免使用强大的解决方案。也不要忘记像 cmder 这样的中等复杂度的解决方案并不是一尘不染的。

Linux 命令遮蔽 Windows 命令的问题是 Cygwin/MSYS2/MinGW 等解决方案中难以调试问题的常见原因。这是一个示例:我有一个使用 timeout 命令的 .bat 文件。在 Cygwin 下运行时会失败,因为 timeout 也是 Linux 命令,但语法不同。发现问题后,我发现我可以在 .bat 文件的顶部添加一个 PATH=... 以确保 windows 命令具有优先级。但是后来我得到了一个更神秘的“不支持输入重定向”错误,并在找到原因之前解决了解决方法。

这是一个 cmder 问题的例子。我在 Cmder 下运行 Windows 版本的 unison,在某些特殊条件下,它完全没有错误消息挂起。相同的命令总是在 cmd.exe 下完美运行。有趣的是它在 Cygwin 下也能完美运行(事实上,如果你有 Unicode 文件名,Cygwin 终端比 cmd.exe 更好,因为 cmd.exe 经常显示格式错误的 Unicode 文本)。

关于本指南

在 2017-05 期间,尽管我很久以前就在使用其中一些工具(主要是 CygWin 和 cmder,但从未用于开发目的),但我对不了解上述工具的差异感到厌烦。所以我花了几个小时来探索风景。本指南是我保留的笔记的结果。我不是该领域的专家,但我努力寻找所有相关信息,以批判的眼光阅读并清楚地呈现最重要的部分。如果出现问题,请发表评论,我会尽力纠正。

最后对一些术语问题表示歉意:在本文中,我有时使用术语 Linux 代替 UNIX 或 POSIX。我知道它们不一样,但是当从如此远的距离接近一个主题时,很难区分它们。即使不难,也需要我没有的时间;-)

  • 这是一个极好的答案,感谢您分享您的发现和经验。 (4认同)
  • 感谢@ndemou 如此详尽的回答。 (2认同)

And*_*eas 11

GitHub 上还提供Clink。它使用钩子库将自身集成到 Windows 命令提示符中。

从项目描述:

Clink 将原生 Windows shell cmd.exe 与 GNU Readline 库的强大命令行编辑功能相结合,提供丰富的补全、历史和行编辑功能。

(所以它不提供 bash-as-a-programming-language 特性或任何其他 Unix 好东西)

我在工作中使用 Linux,发现自己有时会在 cmd 中切换,这与我对 Bash 的期望不同。使用 Clink 我可以克服其中的一些缺点。

最近,我还发现了一个有前途但尚未“全能”的项目,名为flinux,它模拟 Linux 系统功能并在其之上提供某种系统(目前基于 Arch Linux)


Dej*_*kic 10

我建议您下载并安装最小MinGW集以及最小的 MSYS 集。MinGW 安装程序为您提供了一个简单的 GUI 来选择要安装的软件包。如果您只需要 BASH,那么安装不会超过几兆字节。

更新:我移到了MSYS2,它更先进,并且具有用于包管理的 ArchLinux pacman 工具的端口。MSYS2 安装程序拥有您需要的一切,而且它使用的是绝对完美的mintty


dou*_*own 7

除了faffaffaff 所说的Windows 版 Git还包括 Bash 和一些常见的 Linux 命令行程序(例如Vimsedgawk)。它基于MSYS。虽然程序的版本很旧,例如 Bash 是 3.1 版。Cygwin将拥有更新版本的实用程序。

我还使用ConEmu作为终端模拟器(主要用于 Vim 中的语法高亮、标签页和更容易的复制粘贴)。console2也是另一个流行的终端模拟器,虽然我还没有尝试过。