在Windows系统中,Git Bash、Windows Power Shell和命令提示符(Command prompt)有什么区别?

31

我是一个习惯于使用Mac终端的用户,现在我正在使用Windows。

  • 这些CLI选项有什么区别?
  • 什么情况下应该使用其中之一?
  • 还有其他需要考虑的CLI选项吗?
  • 如果你是一个从Mac转到Windows的人,你会使用哪个CLI?

我尝试使用Windows的原因是,我希望确保我的Docker项目的CLI适用于Windows用户,我可以将来自容器的文件写入Windows并确保我的README文件中有Windows用户的说明。基本上,我也要在Windows上测试我所做的一切,比如Python。


2
作为一名Mac Terminal爱好者,我建议你不太可能喜欢其中任何一个选项。在我看来,“Git Bash”并不是一个非常完整的实现,我怀疑许多Windows安装都没有它,并且它只支持到Windows Vista,即不支持Windows XP。PowerShell是一个笨拙,过度冗长的可怕之物,没有理智的人想要去学习它-我认为你可以运行至Windows 7。命令提示符在几乎所有版本的Windows上都可用,但语法和怪癖很糟糕。我没有把它放在答案中,因为这只是我的意见。你的经验可能会有所不同。 - Mark Setchell
3个回答

25

Git Bash就是bash,而bash在MacOS上也是默认的shell。但它不是Windows上的默认shell,虽然有几个实现(CygWin,MinGW等)。
除了bash,Git还捆绑了许多POSIX(UNIX/Linux等)工具;为避免与同名的Windows命令发生“碰撞”,最常见的安装选项是以这样的方式安装bash,即只有在运行bash时才能使用其他POSIX命令。Git安装程序会创建一个快捷方式来启动此“私有”版本的bash,因此称之为“git bash”。

Windows命令提示符运行默认的Windows shell CMD.EXE,它是旧的MS-DOS命令shell COMMAND.COM的派生版本。它不如大多数POSIX shells强大;例如,直到最近它才支持if/then/else结构,并且它不支持shell函数或别名(尽管有一些解决这些限制的方法)。

PowerShell更像是一个脚本编写环境。我会把它与UNIX/Linux系统上的Perl进行比较——比标准shell更加强大,但不一定适合在命令行中使用。
需要翻译的内容:

需要注意的一点是, PowerShell 的一些更好的功能可能需要你更新你的 PowerShell 版本 - 捆绑在 Windows 中的版本通常已经过几年了。更新 PowerShell 通常需要管理员权限,根据版本,您可能还需要更新 .NET 框架。


如果我是一个试图适应 Windows 的 Mac 用户... 那就要看情况而定。短期内,使用类似于 bash 的东西会更容易上手。但长远来看,你 —— 更重要的是,你的潜在用户 —— 可能不想依赖第三方工具,特别是对于 Windows 用户来说,这通常会增加额外的学习曲线。

关于在什么时候使用哪种工具...这实际上取决于你想要实现什么——无论是技术功能还是你想向用户展示的界面。如上所述,除非你只需要运行一个 cmdlet(无论是内置的还是你自己创建的),否则我认为 PowerShell 更适合用于脚本编写而不是 CLI。


“随Windows捆绑的版本通常是几年前的。” - 请注意,从“Windows 10版本1607 / Windows Server 2016”开始,捆绑的Windows PowerShell版本为5.1。它将继续接收安全更新,但不会有新功能。您无需再升级到5.1。PowerShell Core(在撰写本文时为v7.2.2)仍然可以安装,并且与集成于Windows中的PowerShell 5.1分别管理。 - codewario
@Bender 可能是这样。我记得有几次发现有一些 PowerShell 功能满足当前需求,然后发现我必须从 v1 升级到 v2、v2 到 v3 等等。在 v2 之后(我想)似乎需要安装一些我不一定想要的 WMI 或安全包(可能会引起我们的 IT 安全注意)。 - David
我的观点是,(1)我在找到有关PS功能信息的原始页面上,并没有充分说明可能需要升级PS才能使用该功能,(2)PS下载似乎总是附带着很多额外的垃圾。后者代表了我个人认为微软软件中相当持久的模式。 - David

13
这是有关不同shell之间差异的高级概述,而不是逐个特性比较。
CMD(命令提示符)和PowerShell都是Windows的shell。 CMD.exe诞生于COMMAND.COM,后者又来源于MS-DOS,并具有一些逻辑结构,可以运行程序,处理输出并执行大多数基本任务,你能从一个shell中期望到得到的功能。 它通常被认为非常有限,因为其他shell可以做更多事情,但如果您知道如何使用它,则不无能力。然而,它从未真正“设计过”,新功能在没有明确路线图的情况下被添加。 PowerShell是一个从头开始设计的shell,与.NET紧密结合,并内置了更现代的语言结构。 Microsoft将Powershell设计为替代CMD.exe和批处理脚本,尽管CMD远未过时。 Powershell可以直接调用.NET类,本地处理WMI对象,并具有内置的远程处理功能。与批处理脚本相比,它更类似于编程或脚本语言。今天Powershell周围有一个更强大的社区,一般建议在Powershell中编写新代码,而不是继续使用批处理(CMD)脚本。 PowerShell一开始的感觉很像CMD。您可以在其中运行程序并处理其输出,在大多数情况下,无论从Powershell还是从CMD运行程序,程序都会表现出相同的行为。然而,您很快就会注意到一些区别-不是所有变量都被视为环境变量,变量前缀为$,而不是用%包装,并且Powershell管道比CMD管道功能更强大。与大多数其他shell语言主要基于文本不同,Powershell完全面向对象。 您可以在此处阅读更多信息,了解为什么建议使用Powershell而不是批处理脚本,并且还有关于CMD.exe和批处理文件的丰富历史。

Git Bash 是在 Windows 上编译的 bash shell,与 Linux 和 MacOS 上您所熟悉的相同。它具有带有 Git 前缀的名称,表示它是使用Git for Windows安装的,这是一个针对 Git 编译的各种*nix实用程序的包,供与 git 一起使用。您可以在其中运行shbash脚本,以及使用它安装的 Unix 程序。

Unix 实用程序通常也可以在 CMDPowerShell 中运行,但默认情况下,安装程序不会将这些实用程序添加到系统或用户路径中,以避免潜在地覆盖用户可能在其他情况下使用的相同实用程序。基本上,它将安装了 Git Bash 的实用程序隔离到 Git Bash 中。

除了 git 自动化外,我不建议将 Git Bash 本身用于任何生产相关事项,如果是这种情况,您可能更愿意自己管理 cygwinmsys2 或另一个 Unix 兼容性层的安装。但在开发过程中拥有一个方便的 shell 可以派上用场,尽管如今我通常更喜欢使用 PowerShell 而不是 bash 进行 Windows 脚本编写。


1
这是一个非常好的总结。谢谢。 - Omega

0
我是一个长期使用Windows的用户。Windows API、Windows命令行和VB脚本对我来说很自然。你想为你的Docker项目的用户提供原生的Windows体验。
使用WSL。
Docker项目的Windows用户使用WSL(Windows Subsystem for Linux)。总会有例外,但大多数Windows Docker用户首先是Docker用户,希望Docker能够无缝运行,并使用使其成为可能的Windows子系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接