WSL与Windows交互实践
- 1. WSL是什么
- 2. WSL新特性
- 3. WSL管理配置
- 4. WSL交互
- 5. 解决方案
* 5.1 使用别名
* 5.2 多复制一份
* 5.3 重定向
* 5.4 symlink - 6. 其他
* 6.1 闲聊
* 6.2 参考
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
mush@mushroom ~ % ls
go mush test
mush@mushroom ~ % pwd
/home/mush
mush@mushroom ~ %
后面都基于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:
root@mushroom:/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
后缀才行,不然会提示找不到命令 :
root@mushroom:/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
中添加:
command_not_found_handler() {
if cmd.exe /c "(where $1 || (help $1 |findstr /V Try)) >nul 2>nul && ($* || exit 0)"; then
return $?
else
[[ -x /usr/lib/command-not-found ]] || return 1
/usr/lib/command-not-found --no-failure-msg -- ${1+"$1"} && :
fi
}
5.4 symlink
使用符号连接,讲宿主机上的docker.exe 映射到 WSL中:
ln -sf /mnt/c/Program\ Files/Docker/Docker/resources/bin/docker.exe /usr/bin/docker
6. 其他
6.1 闲聊
差不多有2年左右,没写博客了。主要是因为从C#/Net,转向Golang相关的技术栈了,需要重新积累和学习下。前期写了段时间c++,然后写Golang,发现Golang写着舒服多了。当然跟有了女朋友后,变懒也有很大关系。
这篇是开头,希望能继续坚持分享,也有利于自己成长。新博客会同步到github一份,方便备份修改。
6.2 参考
https://docs.microsoft.com/en-us/windows/wsl/interop
https://docs.microsoft.com/en-us/windows/wsl/wsl-config
https://github.com/Microsoft/WSL/issues/2003
WSL与Windows交互实践的更多相关文章
- WSL优化 (Windows Subsystem for Linux) Linux子系统优化配置
目录 wsl优化 (Windows Subsystem for Linux) Linux子系统优化 1. 永久修改wsl终端字体 2. 修改Linux终端配色 3. 添加WSL到右键菜单 wsl优化 ...
- Docker for Windows(五)实践搭建SqlServer服务&执行数据库操作
上一篇我们已经搭建了一个mysql数据库服务了:Docker for Windows(四)实践搭建&删除MySQL服务,发现用Docker确实是方便且容易,但上一篇主要是服务的搭建删除等基础操 ...
- wsl和windows相互访问文件夹
How to access Windows folders from Bash on Ubuntu on Windows You'll find the Windows C:\ structure a ...
- WSL与Windows环境共享
Reference 更多cmd.exe帮助参考 cmd_helps WSL备份及windows Docker安装 WSL安装维护 在使用wsl时,总是需要执行windows的cmd,但是windows ...
- 利用 WSL 在 Windows下打造高效的 Linux 开发环境
WSL-Windows Subsystem for Linux 介绍 The Windows Subsystem for Linux lets developers run Linux environ ...
- 通过WSL在Windows下安装子Linux系统
一.开启开发者模式 步骤: -> 系统设置 -> 更新和安全 -> 针对开发人员 -> 选择开发者模式 点击后会自动安装环境 二.启用WSL 步骤: -> 系统设置 -& ...
- WSL调用Windows下的ParaView对OpenFOAM进行后处理
OpenFOAM可以在windows下的Linux子系统(WSL)安装,但是很麻烦的一个问题是WSL没有图形化的界面,只有一个控制台窗口,在后处理的过程中我们就没有办法直接调用paraFoam命令启动 ...
- VSCode - 使用 WSL(Windows Subsystem for Linux)
一开始我是只将 VSCode 集成的终端改成 WSL 的 Bash,结果发现内置的 GIt 用的还是 Windows 的 Git,Git Hooks 用的 Windows 的环境,上网搜了一下发现有很 ...
- 【笨嘴拙舌WINDOWS】实践检验之剪切板查看器【Delphi】
该程序能够监视Windows剪切板的内容(文字和图片) 其思路是 先调用SetClipBoardViewer(Self.Handle),让Windows剪切板内容发生改变之后,通知本程序: 然后截获W ...
随机推荐
- OSI七层网络模型
概述: OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范.OSI模型有7层结构,每层都可以有几个子层. OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输 ...
- [译]百里挑一:21个优质Swift开源App
Mybridge AI根据代码质量和start排名从900多个开源项目中选出21个开源项目. 1:Firefox iOS [Official] Firefox iOS app built in Swi ...
- cocos2d-js(二)cocos2d-js的基本语法与类的简介
基本语法: 1.类的定义 一般类都是集成Scene或者Layer: var myLayer = cc.Layer.extend({类的内容}); 2类内的成员变量与方法: 2.1成员变量的声明: 变量 ...
- Scipy教程 - 统计函数库scipy.stats
http://blog.csdn.net/pipisorry/article/details/49515215 统计函数Statistical functions(scipy.stats) Pytho ...
- Opencv2.4.9、VS2010配置及grabcut代码实例
最近opencv库更新到了2.4.9,作为小码农的我紧跟时代的步伐,装了2.4.9这个库.以下是我的配置步骤: 1.从http://opencv.org/上下载opencv2.4.9文件,由于我用的是 ...
- 【一天一道LeetCode】#98. Validate Binary Search Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- Socket编程实践(7) --Socket-Class封装(改进版v2)
本篇博客定义一套用于TCP通信比较实用/好用Socket类库(运用C++封装的思想,将socket API尽量封装的好用与实用), 从开发出Socket库的第一个版本以来, 作者不知道做了多少改进, ...
- OJ题:成绩排序
题目描述 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理. 例示: jack 70 peter 96 Tom 70 smit ...
- Leetcode_125_Valid Palindrome
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41488377 Valid Palindrome Given ...
- 基于Qt的手机程序----口袋理财
主页面 记账模块 制定目标 备忘录