还支持更多配置

时间:2022-06-12 01:52:30


?*
?*

1. WSL是什么

? WSL 是Windows Subsystem for Linux 的简称,主要是为了在Windows 10上原生运行Linux二进制可执行文件(ELF格局),而供给的兼容层。 通俗来讲是在Windows10 嵌入了个Linux子系统(默认是ubuntu),便利运行大部分 Linux 命令及软件,好比grep MySQL Apache。这很大便利了使用Windows做开发的同学,,不需要双系统或虚拟机了。

在Windows成果中启用```适用于Linux的Windows子系统```,然后在Windows CMD中直接输入```bash```,即可进入Linux环境,执行命令:

还支持更多配置

2. WSL新特性

从Windows10 1709版本时开始,可以直接输入wsl进入交互环境, bash方法会逐渐废弃失。

以前的 bash -c [command]直接用 wsl [command]来替代。

另一个特性是:Windows 10商店里,可以下载安置其他Linux刊行版。这样就可以*选择,不用限制到Ubuntu。

还支持更多配置

然后可以在措施列表中直接打开Ubuntu进入,或在CMD或Powershell中直接输入ubuntu进入:

PS D:\> ubuntu [email protected] ~ % ls go mush test [email protected] ~ % pwd /home/mush [email protected] ~ %

后面都基于wsl,Ubuntu,powershell来介绍和演示。

3. WSL打点配置

Windows10自带了wslconfig,去打点多个安置的刊行版,好比卸载某个刊行版,设置默认启动的发型版。

在PowerShell中输入wslconfig /?, 可以看到:

PS D:\> wslconfig /? 在 Linux Windows 子系统上执行打点操纵 用法: /l, /list [/all] - 列出已注册的分发内容。 /all - 有选择地列出所有分发内容,包孕目前 正安置或未安置的分发内容。 /s, /setdefault <DistributionName> - 将指定的分发内容设置为默认值。 /u, /unregister <DistributionName> - 注销分发内容。

切换默认刊行版:

PS D:\> wslconfig /l # 适用于 Linux 的 Windows 子系统: Legacy (默认) Ubuntu PS D:\> wslconfig /s Ubuntu PS D:\> wslconfig /l # 适用于 Linux 的 Windows 子系统: Ubuntu (默认) Legacy

在Windows 1803 后,还撑持更多配置。好比网络,root目录等。进入刊行版后, 可以在/etc/wsl.conf中配置。 如果没有该文件,可以手动创建一个配置:

[automount] enabled = true # 自动挂载 c:/ 等到 /mnt root = /windir/ options = "metadata,umask=22,fmask=11" mountFsTab = false [network] generateHosts = true generateResolvConf = true 4. WSL交互

也是从1709开始,WSL撑持在Windows 10上直接使用 Linux命令:

PS D:\test> wsl ls -la total 5836 drwxrwxrwx 1 root root 4096 Jan 25 13:20 . drwxrwxrwx 1 root root 4096 Apr 20 16:25 .. -rwxrwxrwx 1 root root 105 Oct 14 2017 03-build.ps1

同样在 WSL 内也可以使用Windows应用措施,好比notepad,docker:

[email protected]:/mnt/d/go/src/code.teambition.com/soa/webhooks# docker.exe ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 63698edb01a8 quay.io/coreos/etcd:latest "/usr/local/bin/etcd" 2 days ago Up 27 hours 0.0.0.0:2379->2379/tcp, 2380/tcp etcd

这是个非常赞的特性,极大便利了开发者。但在使用过程中发明,有个体验非常欠好的处所,必需带.exe后缀才行,不然会提示找不到命令 :

[email protected]:/mnt/d/go/src/code.teambition.com/soa/webhooks# docker The program 'docker' is currently not installed. You can install it by typing: apt-get install docker

好比同事在mac上写了个docker build的脚本,放到Windows上后 想使用WSL去执行,发明必需加后缀才行,这样脚本就没步伐统一了

5. 解决方案

固然也可以在中装个docker,而不是使用宿主机上的docker。但这样会很冗余,而且性能欠好。颠末一番折腾找到几种解决方案:

5.1 使用别号

在WSL 中.bashrc设置别号,去失后缀:

alias docker=docker.exe alias docker-compose=docker-compose.exe

这样就可以正确运行命令了, 但别号只在交互环境有效,脚本执行坏境不行。

5.2 多复制一份

在宿主机上找到 docker.exe,然后复制一份重定名为 docker 放到同级目录,这样在wsl中也是可以执行的,有点蠢萌黑魔法的觉得。

5.3 重定向

思路是界说command_not_found_handle函数(bash 4.0+ 撑持),当任何命令找不到时,城市挪用挪用它。 然后在该函数中测验考试挪用宿主机上cmd.exe,由它来来执行命令,并返回功效。

在.bashrc中添加:

command_not_found_handle() { if cmd.exe /c "(where $1 || (help $1 |findstr /V Try)) >nul 2>nul && ($* || exit 0)"; then return $? else if [ -x /usr/lib/command-not-found ]; then /usr/lib/command-not-found -- "$1" return $? elif [ -x /usr/share/command-not-found/command-not-found ]; then /usr/share/command-not-found/command-not-found -- "$1" return $? else printf "%s: command not found\n" "$1" >&2 return 127 fi fi }

或在.zshrc中添加: