Windows 10 上的 Bash 和 Ubuntu 终端有啥区别

Posted

技术标签:

【中文标题】Windows 10 上的 Bash 和 Ubuntu 终端有啥区别【英文标题】:What is the difference between Bash and Ubuntu terminals on Windows 10Windows 10 上的 Bash 和 Ubuntu 终端有什么区别 【发布时间】:2018-06-22 12:05:55 【问题描述】:

我最近安装了适用于 Windows 的 Ubuntu,现在开始菜单中有 2 个新项目:

重击 Bash 此终端在以下位置打开:

root@myName-PC:/mnt/c/Windows/System32#

Ubuntu Ubuntu 此终端在以下位置打开:

root@myname-PC:~#

两者有什么区别?

例如,我们想要安装 Git 和 Utils、RVM (Ruby),然后克隆一个 Git 项目并使用 Capistrano 命令通过 SSH 进行部署。应该像上面那样使用 Bash 或 Ubuntu 运行吗?

另外,在终端中,命令应该在 system32 或 C:/ 文件夹中运行吗?

谢谢

【问题讨论】:

【参考方案1】:

Bash 终端是旧样式(在 Windows 10 v1790 又名 Fall Creator Update 之前)。它位于%LocalAppData%\Lxss 并使用lxrun.exe 进行管理。

Ubuntu 终端是新样式,从 Microsoft Store 下载。启动器部分是一个 Windows 应用程序 (%ProgramFiles%\WindowsApp),其数据位于 %LocalAppData%\Packages

这是两个独立安装的 Windows 子系统 for Linux,互不干扰。实际上,您只需要其中一种,因此请根据自己的喜好选择一种。

我个人不喜欢 Windows 应用商店版本,因为它很容易被删除,这对于生产力环境来说不是一件好事。

【讨论】:

【参考方案2】:

我试图删除 旧版“Windows 上的 Bash”,但未能成功,因为我的系统中没有 lxrun.exe。但如果有人需要,here's how:

如果您愿意,您可以手动删除您的旧实例。如果您在使用 lxrun.exe 卸载旧版发行版时遇到问题,或者正在运行不附带 lxrun.exe 的 Windows 10 Spring 2018 更新(或更高版本),则可能需要这样做。

要强制删除旧版 WSL 发行版,请使用 Windows 的文件资源管理器或命令行删除 %localappdata%\lxss\ 文件夹(及其所有子内容):(使用 PowerShell)

rm -Recurse $env:localappdata/lxss/

【讨论】:

【参考方案3】:

git bash 与 Ubuntu bash。

除了 bash 的版本之外,基本上没有什么不同。因为 bash 就是 bash。很可能在不同的时间出于不同的目的在 PC 上安装了不同版本的 bash。它们也很可能在 PC 上的不同文件夹中找到。

从两个不同的 shell 运行以下代码。这将返回 bash 的版本:

echo "$BASH_VERSION"

在这台 PC 上,使用两个终端(MinGW 和 Ubuntu)返回以下版本的 bash:(见下面的图片链接)

5.0.17(1) - release
4.4.23(1) - release

大多数使用 PC 已有一段时间的人可能会发现他们的 PC 上安装了两个(或更多)不同版本的 bash。在这台 PC 上,旧版本的 bash 早在一段时间前就已安装。

在这台 PC 上安装 Cygwin 时,可能已经安装了旧版本的 bash。或者可能是很久以前安装 Git 时安装了旧版本的 bash。现在真的无所谓了。在这台 PC 上,至少可以在以下位置找到 bash:

C:\cygwin64\bin\bash.exe

C:\Program Files\Git\bin\bash.exe

C:\Program Files\Git\git-bash.exe

此 PC 上的 Windows 10 已更新。具体来说,WSL 内核已从 WSL 更新到 WSL2。此更新的一部分涉及开启一些 Windows 功能,包括:适用于 Linux 的 Windows 子系统。

有一个旧(虚拟)版本的 Ubuntu (18.04) 已安装在这台 PC 上一段时间。但是那个旧版本的 Ubuntu 在这次更新中消失了。此 WSL2 更新改变了 Linux (Ubuntu) 在此 PC 上的运行方式。在 WSL2 更新之后,Ubuntu 是从 Microsoft Store 安装的。这是 Ubuntu 20.04。

此 WSL2 更新和新安装的 Ubuntu 版本还在这台 PC 上安装了更新版本的 bash。而这个较新版本的 bash 就是上面显示的较新版本的 bash。

了解这两个 bash 版本之间差异的另一个好方法是在每个 shell 中输入以下内容:

type ping

结果应该清楚地表明一个版本的 bash 提供了来自 Windows 的源代码,而另一个版本的 bash 提供了来自 Ubuntu 的源代码。

ping is /c/windows/system32/ping
ping is /usr/bin/ping

有时一张图片胜过一千字。下面附上两个并排的新 Windows 终端。

这些终端显示两个不同版本的 bash。 Echo 返回在 MinGW shell 中使用的旧版本的 bash,而 Echo 返回在 Ubuntu shell 中使用的新版本的 bash。

【讨论】:

以上是关于Windows 10 上的 Bash 和 Ubuntu 终端有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 10 上的 Git bash 上为标准输入注入 EOF?

bash基本特性

从 Windows 上的 bash 脚本运行 Openssl - 主题不以“/”开头

无法连接到 Ubuntu Windows 上 bash 上的 Docker 守护程序

Windows 10 - Bash(Ubuntu)SU(根密码)[关闭]

如何检查程序是不是在 Windows 上的 Ubuntu 上的 Bash 中运行,而不仅仅是普通的 Ubuntu?