首页
/
工具
/
我如何在 macOS 和 Windows (WSL2) 上使用单个 .zshrc 文件
我如何在 macOS 和 Windows (WSL2) 上使用单个 .zshrc 文件
摘要
这篇文章详细介绍了通过使用条件逻辑来处理操作系统特定行为(如 SSH 和路径命令)的方法,以维护一个适用于 macOS 和 Windows (WSL2) 的单个 .zshrc 文件,从而简化跨平台 shell 配置。
<p><a href="https://lobste.rs/s/9ukost/how_i_use_single_zshrc_file_on_macos">评论</a></p>
查看缓存全文
缓存时间:
2026/09/14 21:05
# 我如何在 macOS 和 Windows(WSL2)之间共享单个 .zshrc 文件
来源:https://talkoren.com/blog/single-zshrc-macos-windows-wsl2
自1999年《黑客帝国》上映以来,我一直对命令行界面情有独钟。驾驭冗长界面的那种掌控感有着独特的魅力(这也是我喜欢CSS、vim和正则表达式的原因之一)。
如今我拥有三台设备——个人的 MacBook Pro,以及两台 Windows 游戏台式机(说来话长,别问)。作为一个命令行爱好者,我早在2016年就开始玩转 WSL(以及后来的 WSL2,它在轻量级虚拟机中运行真正的 Linux 内核)。
从那时起,我便成为 Z shell(zsh)的忠实用户,并在所有设备上使用它。我使用 chezmoi(https://chezmoi.io/)来管理我的点文件,其中就包括 .zshrc。
在 WSL 和 macOS 上使用 zsh 看似简单,因为两者都提供了类 Unix 环境,但在核心系统行为上仍有一些差异,比如使用 ssh 或 `open` 这类便捷命令。因此,维护独立的 `.zshrc.mac` 和 `.zshrc.wsl` 文件不可避免地会导致它们逐渐偏离,而作为一个患有注意力缺陷多动障碍(ADHD)的开发者,我深知这只是时间问题——我肯定会更新一个文件而忘记另一个。因此我管理这些配置的原则是:默认使用一个共享文件,仅在操作系统确实需要区分时才添加条件判断。
## 直奔主题
首先,我需要判断 shell 是否运行在 WSL 环境中:
```
if grep -qi microsoft /proc/version 2>/dev/null; then
IS_WSL=1
fi
```
我设置 `IS_WSL` 变量来区分操作系统。`-q` 标志表示安静模式(我们不想每次启动 shell 都看到 `grep` 的输出),`-i` 则让检查不区分大小写,这样就不依赖 "Microsoft" 的书写格式。
在 macOS 上,`/proc/version` 文件不存在,但错误被重定向到 `/dev/null`,所以条件判断会直接失败。
## SSH
我使用 1Password 的 ssh 代理来避免将私钥存放在 `~/\.ssh` 目录(抱歉了 AI 代理和供应链攻击者),它支持 macOS、Linux 和 Windows。这个区分很重要,因为 1Password ssh 代理作为 Windows 应用的一部分运行,而非在 WSL 内部。在我的配置中,WSL 使用 Windows 的 ssh 客户端,以便与运行在 Windows 上的 1Password 代理通信。
在配置好 1Password(https://www.1password.dev/cli/get-started#step-2-turn-on-the-1password-desktop-app-integration)以使用其命令行工具,并配置 ssh 代理(https://www.1password.dev/ssh/agent)之后,我只需要:
```
if [ "$IS_WSL" = 1 ]; then
alias ssh='ssh.exe'
alias ssh-add='ssh-add.exe'
fi
```
这样可以工作,但 Git 这边有一个小问题——`ssh` 别名只存在于我的交互式 zsh 会话中。当 Git 自身启动 ssh 时,这个别名不会生效,因此我还需要设置 `GIT_SSH_COMMAND`(https://git-scm.com/docs/git#Documentation/git.txt-GITSSHCOMMAND)为 ssh.exe。`scp` 命令同理。
因此最终的条件块为:
```
if [ "$IS_WSL" = 1 ]; then
alias ssh='ssh.exe'
alias ssh-add='ssh-add.exe'
alias scp='scp.exe'
export GIT_SSH_COMMAND='ssh.exe'
fi
```
现在我可以处理 macOS 和 WSL 上所有与 ssh 相关的操作了。
## 使用 Finder 和 Explorer
在 macOS 上,`open .` 会在 Finder 中打开当前目录。在 WSL 中,`explorer.exe .` 大致能在 Windows 资源管理器中实现相同功能。你明白我的意思了...
由于 `open` 在 macOS 上已经是系统命令,我只需要在 Windows 的 WSL 环境中覆盖它:
```
open() {
explorer.exe "$(wslpath -w "${1:-.}")" 2>/dev/null
}
```
`wslpath -w` 将 WSL 路径转换为 Windows 格式,而 `${1:-.}` 在未提供路径时默认使用当前目录。
由于此操作与 macOS 无关,将其仅设置在 WSL 条件下是合理的,完善后的条件块如下:
```
if [ "$IS_WSL" = 1 ]; then
alias ssh='ssh.exe'
alias ssh-add='ssh-add.exe'
alias scp='scp.exe'
export GIT_SSH_COMMAND='ssh.exe'
open() {
explorer.exe "$(wslpath -w "${1:-.}")" 2>/dev/null
}
fi
```
## 简洁即清醒
最终实现的是一个在双系统上都能像原生配置一样工作的 .zshrc 文件。大部分内容保持共享,而少数 Windows 特有的差异集中在一个小型条件块中。可预测、易读、易于维护(保持理智?)。
相似文章
X AI KOLs Timeline
微软发布了 Coreutils for Windows,将 78 个类 Unix 命令引入 Windows 原生终端,方便 AI Agent(如 Hermes、Claude Code)在 Windows 下直接使用 grep、ls 等命令,减少翻译开销。文章详细介绍了安装步骤、别名冲突和验收方法。
The Verge
微软在Build大会上宣布了面向开发者优化的Windows 11体验,包括Windows版Coreutils(原生类Linux工具)、WSL容器(便于管理Linux容器)、集成AI的实验性智能终端,以及可快速配置的Windows开发者配置。
Lobsters Hottest
解释了macOS如何处理两个路径分隔符(斜杠和冒号),这是由于它从经典Mac OS和NeXTSTEP双重继承而来,并且这导致文件在Finder中显示为斜杠,但在终端中显示为冒号。
Reddit r/LocalLLaMA
llama.cpp Console 是一款 Windows 桌面应用,提供图形界面来管理 WSL/Ubuntu 中的 llama.cpp,涵盖安装、构建、模型下载和服务部署。
X AI KOLs Timeline
Hermes AI agent tool now supports native Windows installation without WSL, making it accessible for Windows users to run CLI and bots directly. The article reviews the Early Beta experience, installation process, and compares it with the WSL2 version.