如何在Windows上使用类似Bash的shell?
我用的是Linux和Mac,我很快会教一些命令行的东西。
我可以在Windows上安装什么来给我一个和Mac/Linux Bash shell最相似的终端窗口?
如果可能的话,我希望能够定义.bash/aliases。
我用的是Linux和Mac,我很快会教一些命令行的东西。
我可以在Windows上安装什么来给我一个和Mac/Linux Bash shell最相似的终端窗口?
如果可能的话,我希望能够定义.bash/aliases。
现在您可以安装Windows子系统for Linux,它允许您在Windows上运行本地用户模式的Linux shell和工具。这允许您直接在Windows上运行Bashshell,并基于Ubuntu。
这是在Windows 10的周年更新(2016)中引入的,默认情况下没有启用。要在 Windows 10 Anniversary Update 机器上启用新功能,请执行以下操作。
1.导航到 “设置”->“更新和安全”->“对于开发者",然后选择 "开发者模式 ” 2. 控制面板->程序和功能,然后点击左上角窗格中的 “打开或关闭Windows功能 ” 3. 在对话框中,勾选 “Windows Subsystem for Linux",然后点击 "Ok ” 4. 重新启动机器 5. 搜索 “bash "并点击它,它应该会打开一个命令提示符并询问你是否要安装 "Ubuntu on Windows",继续 "y ” 6. 安装完成后,它会要求你创建一个UNIX用户名和密码 7。现在你已经准备好使用bash shell
一段历史,早在2015年,Astoria项目就开始将Android应用带到Windows上,他们为此建立了一个名为Windows Subsystem for Linux(WSL)的Linux子系统。最终Astoria项目被放弃了,因为它破坏了他们的UWP(Universal Windows Platform,通用Windows平台)战略,但一些部分被保留了下来,并构成了bash for Windows的基础。在这个过程中,微软与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 (视频)
你可以安装Cygwin或MSYS/MinGW,或者你可以在一个虚拟机中安装一个完整的Linux发行版(例如,使用VirtualBox)。
以下是截至2018-05的选项列表,其中有大量关于WSL的更新,截至2020-01,以及关于每个选项的一些细节。
WSL正变得越来越成熟(微软很早以前就放弃了 beta警告),并且非常容易安装,所以在大多数情况下,它是一个非常好的(如果不是最好的)选项。它使用与大多数其他选项不同的方法来解决这个问题。你运行的二进制代码与你在Linux系统上运行的二进制代码完全相同。在2020-01之前,WSL会拦截内核调用,并将其翻译成windows内核调用(与Wine相反)。这将会改变,因为当前测试版的WSL在一个轻量级的虚拟机中运行一个真正的linux内核。
无论如何,使用WSL,你会得到一个漂亮的shell,几乎所有的CLI好东西,你会期望在Ubuntu安装中找到,并且可以选择apt install
几乎所有从资源库中获得的东西。微软官方声明“WSL不以支持GUI桌面或应用程序为目标”然而有非官方的说明如何做到这一点。目前看来(2020-01),WSL的主要缺点有以下几点。
这里是一个老的但很好的与Cygwin的比较 (注意Rich Turner是WSL团队的成员,他发布了很多关于WSL的有用信息)
Cygwin提供了以下内容。
1.一个bash shell和Mintty终端, 2.一个广泛的通用Linux实用程序,编译后可在Windows上运行 3.一个全面的兼容层,使Linux程序能够在Windows上运行。
Cygwin的目标是让Linux应用程序在Windows上的移植变得简单。如果一些C程序是为Unix设计的,并且希望使用诸如管道、Unix风格的文件和目录访问等功能,那么你可以为Cygwin编译它,Cygwin将作为代码和foreign操作系统(Windows)之间的兼容层。这使得同一个C程序可以在Linux和Windows上同时工作,几乎不需要修改。因此,当你安装Cygwin后,可以运行大量的Linux程序。然而,作为这些程序的用户,你可能需要熟悉Unix。例如,你可能需要传递参数,如/cygdrive/c/autoexec.bat
而不是c:\autoexec.bat
,并准备好处理Unix行终止(\n
)而不是Windows行终止(\r\n
)的输出。
所有Cygwin程序的集合构成了一个程序库,尽管Cygwin没有传统的Linux包管理器,但你可以随时用一种非常反常的方式从这个程序库中添加、删除和更新程序(你可以在任何时候运行Cygwin的setup.
Mingw-w64提供了以下功能。
MinGW主要是一个软件发行版和Windows的构建平台。特别是它是GNU编译器工具的Windows移植,如GCC、make、bash等。它包括了相当多的GNU工具和一个最小的Unix兼容层。
Mingw-w64和Cygwin的主要区别在于优先级上。Cygwin的目标是提供一个完整的POSIX兼容层,包括所有主要的Unix系统调用和库的完整实现;性能是次要的,而不是兼容性。MinGW的目标是性能,所以它不会提供某些在Windows下不能轻易实现和/或足够快的POSIX API。同时MinGW的主要目标是S/W开发者。尽管如此,普通用户也可以享受它的shell和通用的实用工具。
MSYS2 提供了以下功能。
1.一个bash shell和Mintty终端, 2.相当数量的Linux实用程序, 3.一个功能齐全的命令行包管理器来安装操作系统程序, 4.来自Cygwin和MinGW的部分支持构建应用程序,无论是否有一个全面的Linux兼容层。 5. 一个软件仓库和一个软件包管理器(pacman),它使在Windows上安装、使用、构建和移植软件变得很容易。
MSYS2也是一个? MSYS2主要是一个软件发布和Windows的构建平台,就像MinGW一样,但它结合了Cygwin的方式和MinGW的方式。你可以用MSYS2来创建“MinGW程序”或“MSYS2程序”。后面链接到MSYS2的兼容层(msys-2.dll),它本身就紧跟Cygwin的兼容层开发,只是增加了一些补充/修改。这2个项目的资源库是完全不相关的。所以尽管MSYS2和Cygwin都提供了grep.exe
,但他们可能有一个完全不同的版本。
除了WSL之外,上面的大部分工具都有很多共同的技术(库、可执行文件、概念)。例如MinGW自带的bash shell依赖于msys-2.dll,而msys-2.dll本身就是cygwin.dll的一个分支。所以是的,有很多混淆的空间 :-)
Cmder 只是提供了一个漂亮的终端和一个类似于Windows的bash shell。它的主要组件是* Conemu (终端)。除此之外,它还添加了Clink,它提供了强大的bash风格的命令行编辑,自定义的提示符布局和Monokai配色方案。它与原生的windows控制台程序高度(或者说完全)兼容。
Scoop**为许多知名的跨平台程序提供了一个命令行包管理器,包括许多GNU工具。它下载预编译的软件包。它既不提供shell也不提供终端,而是在windows的cmd.exe下运行(有其所有的限制,但也与本地windows控制台程序完全兼容)。它也不包含编译器套件(当然,编译器和开发工具是典型的软件包,你可以用 scoop 安装)。Scoop安装的很多程序要么是直接来自MinGW/MSYS项目,要么是使用他们的工具构建的。
下面的解决方案似乎并不活跃,我从来没有测试过它们,但它们似乎可以满足其他人的需求。
Gow ** (Gnu On Windows) 是Cygwin的轻量级替代品,没有shell。它使用一个方便的Windows安装程序,可以安装大约130个非常有用的开源Linux应用程序,这些应用程序被编译成原生的win32二进制文件,并可通过windows的cmd.exe进行安装。它的设计是尽可能的小(约10 MB)。
UnxUtils & GnuWin32 **: UnxUtils是一个将常见的GNU Unix-like实用程序移植到本地Win32的集合,其可执行文件仅依赖于微软的C-runtime msvcrt.dll。你必须下载 主体部分 和一些 更新 。GnuWin32的版本比UnxUtils晚,但需要支持文件(例如DLLs)
MSYS & MinGW似乎已经被MSYS2 & MinGW-W64淘汰,所以我从来没有看过它们。
Mintty是Cygwin、MSYS2及其衍生产品中使用的终端。需要注意的是,如果你运行的是windows原生的控制台程序,它并不能毫不费力地替代Windows命令提示符。虽然简单的文本输出程序通常可以正常工作,但交互式和全屏的程序往往会出现问题。阅读 Mintty主页上的更多内容 ,也可以阅读 Git for Windows FAQ 上的条目 “某些原生控制台程序从Git Bash运行时无法工作"。该条目有这样的建议:
有几种方法可以解决这些问题:
最重要的两件事是要记住的。
2.如果你没有丰富的Linux经验,就不要使用更强大的解决方案,比如Cygwin/MSYS2/MinGW
UnxUtils和GnuWin32的功耗最小,但也是最不可能让你头痛的。Cygwin和类似的软件在功耗和头痛方面都会名列前茅。Cmder则处于中间位置。所以 当你需要最强大的解决方案时,要睡个好觉,全神贯注。避免在测试一些新的、可能不稳定的东西时使用强大的解决方案。另外别忘了,像cmder这样中等复杂度的解决方案也不是一尘不染的。
在Cygwin/MSYS2/MinGW这样的解决方案中,Linux命令影子windows命令的问题是造成难以调试的麻烦的常见原因。这里有一个例子。我有一个使用超时命令的.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。我知道它们是不一样的,但是当从这么远的距离接近一个主题时,区分它们是非常困难的。即使不难,也需要花费我没有的时间;-)
我建议你下载并安装一套最小的 MinGW 和最小的MSYS。MinGW安装程序给你一个简单的GUI来选择你想要安装的包。如果你想要的只是BASH,那么安装不会超过几兆字节。
更新:我转到了MSYS2,它更先进,并且有ArchLinux pacman工具的移植包管理。MSYS2安装程序拥有你所需要的一切,再加上它使用了 mintty 这绝对是完美的。
也有Clink可供选择在GitHub。它使用钩子库将自己集成到windows命令提示符中。
从项目描述来看。
Clink将原生的Windows shell cmd.exe与GNU Readline库强大的命令行编辑功能相结合,它提供了丰富的完成、历史和行编辑功能。
(所以它不提供bash-as-a-programming-language的功能,也不提供任何其他Unix的好东西)
我在工作中使用Linux,发现自己有时会在cmd中打标签,而cmd的表现并不像我所期望的Bash。有了Clink,我可以克服这些缺点。
最近,我还发现了一个很有前途的,但还不是 “万能的 "项目,叫做flinux它可以模拟Linux系统功能,并在其上提供某种系统(目前基于Arch Linux)。
除了 faffaffaff说的, Git for Windows 还包括Bash和一些常见的Linux命令行程序(如 Vim , sed ,和 gawk )。它的基础是 MSYS 。不过程序的版本比较老,比如Bash是3.1版本。 Cygwin 会有更近的实用程序版本。
我也用 ConEmu 作为终端仿真器(主要是为了在Vim中高亮显示语法,标签页,以及更容易复制粘贴)。console2也是另一个流行的终端仿真器,虽然我还没有尝试过。
我刚刚用 Babun 尝试了一下,它内部集成了Cygwin,我觉得味道不错 :)
下载文件稍大,大约250 MB。但安装很直接,不需要配置任何东西,它就能正常工作了。