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 default,default via <IP> 中的 IP 就是。
2. CRLF 换行符导致 Bash 异常
现象
从 Windows 文件系统(/mnt/d/)拷贝的 .bashrc / .zshrc 等文本文件在 WSL 中加载时出现:
Malformed input to a URL function(curl 代理 URL 畸形)command not found(不可见字符干扰)
原因
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 传参乱 | 变量提前展开 + 引号嵌套 | 写临时脚本文件 |