← Linux 分类
LINUX

WSL 迁移经验记录

在 Windows 上使用 WSL 运行 Linux 的完整配置与踩坑记录。包含代理设置、CRLF 换行符修复、PowerShell 传参技巧等。


1. 获取 Windows 宿主 IP 的正确方式

问题

第一次配置代理时,使用 cat /etc/resolv.conf | grep nameserver 获取的 IP(10.255.255.254)无法连通代理端口。

原因

/etc/resolv.conf 中的 nameserver 是 WSL 的 DNS 解析器地址,不是 Windows 宿主在网络中的 IP。

正确做法

用路由表获取网关 IP,它才是 Windows 宿主在 WSL NAT 网络中的地址:

host_ip=$(ip route show default | awk '{print $3}')

或者直接查看 ip route show defaultdefault via <IP> 中的 IP 就是。

2. CRLF 换行符导致 Bash 异常

现象

从 Windows 文件系统(/mnt/d/)拷贝的 .bashrc / .zshrc 等文本文件在 WSL 中加载时出现:

原因

Windows 文本文件使用 CRLF\r\n)换行,而 Linux 期望 LF\n)。Bash 将 \r 视为 URL 或命令的一部分。

修复

sed -i 's/\r$//' ~/.bashrc ~/.zshrc ~/.profile

如果文件还带有 UTF-8 BOM(,U+FEFF),追加:

sed -i '1s/^\xEF\xBB\xBF//' ~/.bashrc ~/.zshrc ~/.profile

预防

从 Windows → WSL 拷贝文本文件后,始终运行 sed -i 's/\r$//' 清理。

3. PowerShell 向 WSL 传命令的转义陷阱

问题

以下命令在 PowerShell 中直接运行会导致各种异常:

wsl bash -c "echo $PATH"           # PowerShell 先展开 $PATH
wsl bash -c "awk '{print $1}'"     # 引号嵌套错乱

最佳实践

将命令写入临时脚本文件,再通过 /mnt/c/... 从 WSL 中执行:

@'
#!/bin/bash
echo "Hello from WSL"
'@ | Set-Content -Path "$env:TEMP\wsl_script.sh" -Encoding UTF8

总结

根因修复
代理连不上用了 DNS 地址而非网关ip route show default
Bash 报错CRLF 换行符sed -i 's/\r$//'
PowerShell 传参乱变量提前展开 + 引号嵌套写临时脚本文件