Windows 命令行相关配置
更新于 2026-01-18
常用 shell
一直以来 windows 的命令行方案都很多,个人感觉都有不太好用的点,怎么配置也是仁者见仁智者见智的一个事情。先总结一下常用shell 方案
powershell官方shell,各种工具库支持最全,缺点自带的命令太长,以至于完全没有日常使用的想法。msys2windows 上的类 unix 环境,基于现代 Cygwin (POSIX兼容层) 和 MinGW-w64(工具包)。确实像 unix,一般命令可以无缝迁移。缺点是兼容性,需要手动配置很多东西,比如是否继承 windows 环境变量,不继承的话不想维护两份环境,继承了又容易冲突。git bashmsys2 阉割版,无包管理,多了 git。wsl完全的 Linux 子系统,但太占内存。
方案选择
我需求
- 常用命令必须是类 unix 命令
- 冷启动快较
- 有包管理器,各类命令行工具配置友好且兼容性不错。
- 不要太占内存
结果发现这是四圈相交,没有任何一个常用方案能满足以上要求。
最后,我决定用 powershell。除了第一条外都满足。后面两条属于难以解决的硬伤,而第一条可以编写脚本,将常用的命令模拟。
两年后我觉得这个决定无比正确。因为这两个系统底层是完全不同的,系统管理的软件也完全不同。只是模拟一下日常使用的命令的话,自己写的几个足够无痛迁移的了。当然,语法上比如换行、管道之流,会差得非常多,但是在日常使用中倒也不会日常写脚本。
如果具体到需要使用某个应用(比如 node),还是应该用给 windows 编译的版本,而且这个工具一定是在 windows 的环境变量里,不要像 unix 的习惯那样放在终端的配置文件里。
msys2 不太实用的原因也在于此,在 msys2 里面配置的工具集难以准确筛选出需要暴露到系统中的部分。有的时候你可能只是想用一下 g++ 。最后发现模拟半天,不如用 rust(不是)
powershell 配置流程
包含工具包、终端美化。
- Install the latest Powershell Core
- Install git-bash for basic bash and git tools
- Install Windows Terminal and open Powershell
- Install PSReadLine
- Install starship with scoop. (or
oh-my-poshwith winget) - Install gsudo for softlink
- Install eza for listing
- open
$PROFILEin powershell, append the contents of Microsoft.PowerShell_profile.ps1
大致介绍一下用途。
- git-bash,一系列类 unix 工具,git 一类的
- Windows Terminal,微软的终端。我拒绝终端用 electron 去套的……
- PSReadLine,改变一系列 powershell 的行为。比如复制粘贴的快捷键。可惜在 vscode 里会没用,只能右键粘贴。
- starship,美化。如果用 oh-my-posh,需要用 Winget 或者自己 Setup 安装,不要让 Scoop 装,找环境变量这一步能把启动速度拖慢1s。
- gsudo,提权,类似 unix 的 sudo。可能运行时会被杀软报毒,需要加入信任区。
- eza,2024年了,终于有了一个像样的 ls 替代……
powershell 的用户配置文件输入 $PROFILE 就能找到。
我的配置文件上传到了 Microsoft.PowerShell_profile.ps1。需要挂代理打开。配置文件包含 ls ln open grep which 等命令模拟。powershell 的缩写默认支持了 mv cat rm 等命令,配合起来日常基本够用。
终端代理
我在配置文件中设置了proxy和unproxy函数,以快速设置与取消终端的代理连接。自己改下端口就能用。因为我自己习惯上不开系统代理,都是软件内的 http 连接。
# Proxy Togglers
function proxy {
$portInUse = netstat -ano | findstr "LISTENING" | findstr "7890"
$portInUse2 = netstat -ano | findstr "LISTENING" | findstr "10808"
if ($portInUse -ne $null) {
$env:HTTP_PROXY = "socks5://127.0.0.1:7890"
$env:HTTPS_PROXY = "socks5://127.0.0.1:7890"
Write-Host "Proxy set to socks port 7890"
} elseif ($portInUse2 -ne $null) {
$env:HTTP_PROXY = "socks5://127.0.0.1:10808"
$env:HTTPS_PROXY = "socks5://127.0.0.1:10808"
Write-Host "Proxy set to socks port 10808"
} else {
$env:HTTP_PROXY = "socks5://127.0.0.1:1080"
$env:HTTPS_PROXY = "socks5://127.0.0.1:1080"
Write-Host "Proxy set to socks port "
}
}
function unproxy {
$env:HTTP_PROXY = ""
$env:HTTPS_PROXY = ""
}
其他常用工具
- winget:自带的包管理器,命令行工具都是这个装的。部分用的 scoop,非常少。还有的直接用的官网 setup。
- nvim:命令行编辑器,vim 的替代品。自己还是配了一个无 LSP 版本的 nvim的。感想是 windows 真难。nvim 就是属于只有自己配过才能符合需要且记得住那么多的快捷键,因为都是自己常用的。
- nodejs:JS 环境,nvim 的插件要用,开发也要用。用 nvm 管理的,感想是不要随便 update 自己。
- zoxide:快速跳转目录。最有用的功能没有之一。类似于 Linux 上的 autojump
- ripgrep:类似 grep 的用法。我在模拟 grep 命令时只是单纯替换成了 findstr,真的 grep 建议用 ripgrep (rg) 替代。nvim 的 telescope 一些插件也会用到。
安装脚本汇总:
winget install neovim
git clone --depth=1 https://github.com/sansui233/my-nvim ~\AppData\Local\nvim
winget install gerardog.gsudo
# z-jump
winget install zoxide # z-jump, see https://github.com/ajeetdsouza/zoxide
winget install BurntSushi.ripgrep.MSVC # grep 的完全替代品
ZSH
有关 zsh 相关的配置,我放在了 Windows 命令行相关配置之 msys2+zsh+zi 。现在完全不用 zsh主要是启动慢解决不了。bash 还偶尔用一下。从速度上说,我体感是
- bash 0 配置 = powershell 配置完
- zsh 0 配置 = bash 加上 oh-my-bash
一旦体验过 600ms 内的冷启动速度,就再也回不去了…… windows 关窗口等于关进程,我已经不知道多少次误关过邮件服务了,这使得 windows 冷启动的场景比 mac 多很多,所以冷启动速度还挺关键的。
另外就是两种风格的路径不通用实在有点麻烦,pwd 还需要专门转 cygwin 转一下。每次用 which 还得 cygpath.exe -w $(which bash) 。后面才觉得路径不通过这个点算是比较致命的……以及环境隔离的话,又很难同步 ssh 配置……
速度优化
上述包都是我优化很久之后的结果,实际上安装第三方的工具时,会有各种东西注入来拖慢启动速度。
1. Conda
conda 初始化后,启动脚本会放到 User 级别的 profile.ps1 里,能拖慢3秒启动……
解决方法:不要用 conda,用 uv。或者写成一个启动函数
function Conda-Activate {
#region conda initialize
# !! Contents within this block are managed by 'conda init' !!
If (Test-Path "C:\Users\lingn\scoop\apps\miniconda3\current\Scripts\conda.exe") {
(& "C:\Users\lingn\scoop\apps\miniconda3\current\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression
}
#endregion
}
2. 美化的选择
我发现 starship 比 oh-my-posh 慢了 200ms……这也是我还是在用 oh-my-posh 的原因。大概是因为 starship 开箱即用很全面。
3. posh-git
git 补全也是很爽,但是能启动拖慢 700ms……所以注释掉了。真的遇到不会用的命令与其看 command line 不如问 AI 快。