什么是Unix-Like

引用维基百科的定义:A Unix-like application is one that behaves like the corresponding Unix command or shell. Although there are general philosophies for Unix design, there is no technical standard defining the term, and opinions can differ about the degree to which a particular operating system or application is Unix-like.

通俗的理解其实就是通过 shell 使用一系列命令来流式的与操作系统进行交互, Windows 同样拥有 shell ,但是由于其自成体系,同时在服务器领域的式弱而导致其语法晦涩,大多数用户知之甚少。

如果不从事 Windows 系统运维工作的话,我们应该没有必要去学习 Windows Shell 的相关语法。但是 Windows 作为桌面系统几乎垄断的存在,我们又不得不使用它,那么如何在 Windows 上使用我们熟悉的 shell 语法?

为什么不是 WSL

WSL 的使用已经非常便捷,但它依然存在一些痛点:

  • 由于其以虚拟机的形式运行,导致其内存占用较多,冷启动慢。
  • 无法直接与内网机器交互,只能通过端口映射或者代理实现。
  • 本地磁盘挂载在 /mnt 下,没有传统 home 目录方便。

其实以上问题的根本还是虚拟机,尽管微软已经做了很多努力。

如何构建Unix-Like

注:由于 Windows 自身设计与传统 Unix 的背离,无论社区怎么努力也不会得到很好的兼容性。

首先我们需要一个包管理器,我想使用过包管理器的同学再来回看 Windows 上传统的软件安装方式简直蠢笨,完全就是产品设计的时代遗产,可惜一直沿用至今。 本文选择使用 scoop,它的仓库还是比较丰富的,甚至 qq微信 这类都能在上面安装,很方便强大。

scoop 安装

注意⚠️:文章内所有软件的安装都依赖良好的网络环境,如果碰到网络问题请自行配置代理解决。

请使用 Powershell 执行, CMD 可能会遇到问题。

默认情况下所有 scoop 安装的内容均在 %USERPROFILE%\scoop 目录存储

使用 Windows Terminal ,执行下面命令:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

然后在安装一些基本依赖:

scoop install git
scoop bucket add extras

注:更详细的内容请参阅 scoop 文档

配置 Shell

为了尽可能还原我们在 Unix-Like Shell 上面的体验,我们需要挑选一个好用的 shell,这里我推荐 nushell 至于原因嘛,它是唯一一个我能找到原生支持 WindowsUnix-Like Shell🫠

我们通过 scoop 安装和配置 nushell

scoop install nu

首次启动 nushell 时会提示初始化配置文件,默认路径是 %APPDATA%\nushell\config.nu 

具体请参考 官方文档

nushell 的默认配置可用性已经不错了,但是可以再添加两个小工具来包装一下 :

scoop install starship carapace-bin

其中 starship 是一个 shell prompter,可以让我们的命令行更漂亮,类似于 on-my-zsh 之类。

carapace-bin 是一个补全工具,一定程度上弥补我们自动补全的缺失。

使用 nushell 执行下面命令初始化 starship

mkdir ~/.cache/starship
starship init nu | save -f ~/.cache/starship/init.nu
echo "source ~/.cache/starship/init.nu\n" | save --append $nu.config-path

使用 nushell 执行下面命令初始化 carapace-bin

mkdir ~/.cache/carapace
carapace _carapace nushell | save --force ~/.cache/carapace/init.nu
echo "source ~/.cache/carapace/init.nu\n" | save --append $nu.config-path

安装Unix-Like软件

我们的 shell 配置好了,接下来我们继续安装一些 Unix-Like 软件包:

  • coreutils类Unix 系统会包含的核心软件包,通常包含:cp,cd,dd,ls,...等。 执行 scoop install uutils-coreutils 安装该软件包的 Windows 兼容版,由于跨平台问题,有一些命令是无法使用的,不过我们常用的工具基本都包含了。具体兼容性请参考 官方文档
  • sudo 执行 scoop install gsudo 安装 sudoWindows 模拟版,尽管 Windows 的权限管理与类 Unix 完全不同,但是我们仍然可以借助 sudo 的概念做一些终端操作,比如在 C盘 的某些目录操作文件,而且微软也在开发 sudo 的兼容版[1],不过暂时没有在正式版发布。
  • grep uutils-coreutils 并未提供 grep 之类的文本处理软件,我们手动安装一下别的版本: scoop install grep
  • vim\nvim 终端必备,执行安装:scoop install neovim or scoop install vim
  • btop 很遗憾 htop 并没有 windows 兼容版,我们可以使用功能更强大的 btop 替代。 执行安装:scoop install btop

至此,我们就获得了一个相对比较熟悉和好用的 shell 环境。

终端

  • Windows Terminal  作为现代 Windows 系统的内置 Terminal ,界面美观且功能强大,但是个人觉得略重。通过 scoop 安装的 nushell 不会自动配置 Windows Terminal ,需要我们在 Windows Terminal 中手动添加 nushellprofilenushell 安装地址为:%USERPROFILE%\scoop\apps\nu\current\nu.exe
  • Alacritty 跨平台,足够轻便,功能强大。执行 scoop install alacritty 可安装默认读取配置文件: %APPDATA%\alacritty\alacritty.toml我们创建上述文件并添加以下配置即可集成 nushell
[shell]
program = 'C:\Users\换成你的用户名\scoop\apps\nu\current\nu.exe'
# 如果不是通过 scoop 安装的 nushell 请自行配置正确的 nushell 启动路径

 

Docker

  • Docker Desktop 功能完善,兼容性好,但是比较重。
  • Podman Docker 轻量级替代品,同样支持 Windows , 日常使用应该也够用了。

以上两个工具都可以无缝衔接至我们的 shell 环境,无需使用 WSL shell ,但是容器化实现依然依赖于 WSL 或虚拟机,大家可根据实际情况自行选择。

最后

至此,在不依赖任何虚拟化技术的情况下配置了一个相对比较熟悉的 Unix-Like 环境,基本能够满足我们日常使用了。

MSYS2 项目能够在 Windows 下模拟 bash 环境,但是使用体验差强人意,大家可自行了解。

本文仅针对于日常的系统交互性的 shell 进行配置,未考虑 Windows类Unix 的交叉编译情况。

作者本人主张 远程开发 模式,尽可能的把 工作流 放在远程服务器,降低对本地环境的依赖,从而让工作流拥有更好的跨设备性和环境稳定性,以及良好的协作可能,桌面环境永远不会有服务器环境的稳定性,使用远程开发模式能够抹除我们终端开发工具的差异性,更好的融入 Devops 流程。

我今天所介绍的几乎所有的项目都使用 rust 编写的跨平台软件。尽管很多人对 rust 持有质疑态度,但是 rust 对开源项目的现代化贡献是无容置疑的。如果没有 rust 社区的努力,我想今天我们不会有这么多兼容性良好的跨平台软件使用。

并不是说其他语言跨平台性不好,事实上,现在的所有主流语言应该都有良好的跨平台性,但并不是每个项目都注重跨平台性的,也不是每个开发者都拥有跨平台开发意识和能力,而正式这波 RIIR 潮流贡献了非常多跨平台软件。

参考文档