脱颖而出的选择

脱颖而出的选择

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

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

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

答案1

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

答案2

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

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

  1. 导航至“设置”->“更新和安全”->“面向开发者”,然后选择“开发者模式”
  2. 控制面板 -> 程序和功能,然后单击左上角的“打开或关闭 Windows 功能”
  3. 在对话框中,选中“Windows Subsystem for Linux”,然后单击“确定”
  4. 重启机器
  5. 搜索“bash”并单击它,它会打开一个命令提示符并询问您是否要在 Windows 上安装“Ubuntu”,继续“y”
  6. 安装后,系统会要求创建 UNIX 用户名和密码
  7. 现在您就可以使用 bash shell 了

回顾一下历史,早在 2015 年,Astoria 项目就已启动,旨在将 Android 应用引入 Windows,为此他们构建了一个名为 Windows Subsystem for Linux (WSL) 的 Linux 子系统。最终 Astoria 项目被放弃,因为它破坏了他们的 UWP(通用 Windows 平台)战略,但一些部分被保留下来,并构成了 Windows 版 bash 的基础。在此过程中,微软与 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(视频)

答案3

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

脱颖而出的选择

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

使用 WSL,您可以获得在 Linux 安装中期望找到的 99.9% 的 CLI 程序/实用程序,并且可以选择安装存储库中几乎所有可用的内容(包括 GUI 应用程序)。

因此,在大多数情况下,WSL 是最佳选择。长期以来被认为是稳定的,安装起来非常容易,唯一的主要限制是不能从 Windows 程序编辑 WSL(Linux) 文件,而且微软不支持在生产环境中运行 Linux 服务(请参阅我可以将 WSL 用于生产场景吗?)。您还需要成为 99% 拥有 64 位 Windows 安装的用户之一。

微软有一个如果您考虑使用 WSL,则提供全面的常见问题解答. 还有WSL 1 与 cygwin 的一个非常古老但很好的比较(请注意,Rich Turner 是 WSL 团队的成员,他发布了很多与 WSL 团队相关的有用信息)。

对于好奇的人来说,WSL 使用与大多数其他选项不同的方法解决了运行 Linux 软件的问题。WSL 1 拦截内核调用并将其转换为 Windows 内核调用(与 Wine 相反)。WSL 2 在可以访问 Windows 文件系统的轻量级 VM 中运行真正的 Linux 内核。

赛格威巴本

Cygwin 提供以下内容:

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

Cygwin 旨在使 Linux 应用程序在 Windows 上的移植变得简单。如果某个 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安装已完成)

巴本是 Cygwin,带有功能齐全的包管理器 (pact)、oh-my-zsh 作为其 shell、git、自动更新和面向插件的架构。虽然默认 shell 是 zsh,但您可以轻松切换到 bash。如果您不介意额外的重量,它似乎是从 vanilla Cygwin 升级的不错选择。

Mingw-w64

Mingw-w64 提供以下内容:

  1. 一个 bash shell,
  2. 相当多的 Linux 实用程序,
  3. 一个 SW 开发工具链,用于构建无需 Linux 兼容层(或仅需最小兼容层)即可运行的应用程序。

MinGW 主要是一个适用于 Windows 的软件发行版和构建平台。具体来说,它是 GNU 编译器工具(如 GCC、make、bash 等)的 Windows 移植版。它包含大量 GNU 工具和最小的 Unix 兼容层。

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

管理系统2适用于 Windows 的 Git

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,而 msys-2.dll 本身是 cygwin.dll 的一个分支。所以确实存在很多混淆的空间 :-)

更多的选择

康德为 Windows 提供了一个不错的终端和一个类似 bash 的 shell。它的主要组件是科内穆(终端)。除此之外,它还添加了碰杯提供强大的 Bash 风格命令行编辑、自定义提示布局和 Monokai 配色方案。它与原生 Windows 控制台程序高度(或许是完全)兼容。

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

更多选择

下面的解决方案似乎不太有效,我从未测试过它们,但它们似乎对其他人有用:

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

Unx工具类&操作系统Unx工具类是将常见的类 GNU Unix 实用程序移植到原生 Win32 的集合,其可执行文件仅依赖于 Microsoft C 运行时 msvcrt.dll。您必须下载主要部分还有一些更新操作系统比 UnxUtils 有更新的版本,但需要支持文件(例如 DLL)

管理系统&明网似乎到过已过时由 MSYS2 和 MinGW-W64 编写,所以我从未看过它们。

Cygwin 和 MSYS2 上的一些常见问题

关于终端

Mintty 是 Cygwin、MSYS2 及其衍生产品中使用的终端。请注意,如果您运行的是 Windows 原生控制台程序,它并不是 Windows 命令提示符的轻松替代品。虽然具有简单文本输出的程序通常可以正常工作,但交互式和全屏程序通常会出现问题。阅读更多信息请访问 Mintty 主页并阅读了“从 Git Bash 运行时某些本机控制台程序不起作用”的条目Windows 版 Git 常见问题解答。当您遇到此类问题时,该条目会给出以下建议:

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

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

其他事宜

要牢记的两件最重要的事情是:

  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

还有碰杯可用的在 GitHub 上. 它使用钩子库将自身集成到 Windows 命令提示符中。

来自项目描述:

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

(因此它不提供 bash 作为编程语言的功能或任何其他 Unix 优点)

我在工作中使用 Linux,有时发现自己在 cmd 中按 Tab 键时,其行为与 Bash 中的行为不同。使用 Clink,我可以克服其中的一些缺点。

最近,我还发现了一个很有前途但还不是“万能”的项目,叫做linux系统它模拟 Linux 系统功能并在其上提供某种系统(目前基于 Arch Linux)

相关内容