Ubuntu子系统折腾记

Ubuntu子系统折腾记

已经不记着什么时候安装的win10 Ubuntu子系统,当时只是尝鲜,并没有深入使用。非常遗憾,没有留下当时的安装记录,只好请读者自行问度娘。
今天有空折腾了一番Ubuntu子系统,使它与Windows强强联合,在Windows下也可以使用Linux强大的命令行系统,提高工作效率。

让WSL代替cmd和PowerShell

在win10中,有两个命令行窗口:cmd和PowerShell。这二位比起linux的shell简直弱爆。cmd是微软的大儿子还正常一点,PowerShell这个小儿子简直就是被微软溺爱成了神经病。要命的是微软还越来越倾向于这个不成气的小儿子,实在让人头疼。
那么有没有人代替这二位呢,有朋友使用Git Bash,它可以有限的使用一些linux命令。我还使用了cmder很长一段时间,感觉比Git Bash还要好用一些,只是启动速度有些慢。
今天决定折腾一下Ubuntu子系统(WSL),让它反客为主,代替cmd和PowerShell。

将Ubuntu子系统放到桌面

Ubuntu子系统是使用win10应用市场安装的。安装完成后,在cmd或运行中输入wsl命令,可以启动Ubuntu子系统的命令行窗口,也能够在开始菜单中找到它并添加到开始屏幕和任务栏。就是找不到一个类似“发送到桌面快捷方式”的选项。这不是故意恶心人嘛!

一次偶然的操作,让我不那么恨微软的设计人员了,原来可以直接将开始屏幕的磁铁拖到桌面上,创建桌面快捷方式。这难道是win10隐藏的一个彩蛋吗?

操作Windows上的硬盘文件

Ubuntu子系统是可以直接操作Windows上的硬盘文件的,只是路径稍微变一下。windows的硬盘分区的各个盘符被分别挂载到了/mnt目录下,即C盘是/mnt/c,D盘是/mnt/d,以此类推。

进入这些目录,就可以操作Windows上的硬盘文件。

调用Windows中安装的Python

既然是子系统,我当然不希望它是一个独立的系统,而是希望它可以和windows高度融合。比如,我要用python进行开发,当然不希望在windows和子系统中安装两套Python环境。要在linux下测试完全可以是虚拟机或其他机器嘛。子系统就应该是对Windows系统的辅助,而不是独立的两个个体。
那么子系统中可以调用windows中的python吗?接下来,实验开始:

zhangmh@LAPTOP-8507OGEN:/mnt/c/Users/zhang$ python

Command 'python' not found, but can be installed with:

sudo apt install python3
sudo apt install python
sudo apt install python-minimal

You also have python3 installed, you can run 'python3' instead.

zhangmh@LAPTOP-8507OGEN:/mnt/c/Users/zhang$ /mnt/c/Python37/python.exe
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

哇,正如我所料,WSL中没有安装Python,但它完全可以运行Windows中的Python。接下来,只需要输入python让WSL来运行/mnt/c/Python37/python.exe就好了。做到这一点,应该是一件非常轻松的事情。

  • 思路1:在/usr/bin目录下创建python链接

只需要在在/usr/bin目录下创建一个python的软链接,链接到/mnt/c/Python37/python.exe就行了嘛,linux下自动编译python经常这么干。说干就干:

zhangmh@LAPTOP-8507OGEN:/mnt/c/Users/zhang$ cd /usr/bin
zhangmh@LAPTOP-8507OGEN:/usr/bin$ sudo ln -s /mnt/c/Python37/python.exe python
zhangmh@LAPTOP-8507OGEN:/usr/bin$ ll | grep python
lrwxrwxrwx 1 root   root          23 Oct 22  2018 pdb3.6 -> ../lib/python3.6/pdb.py*
lrwxrwxrwx 1 root   root          31 Oct 25  2018 py3versions -> ../share/python3/py3versions.py*
lrwxrwxrwx 1 root   root          26 Mar 24 17:16 python -> /mnt/c/Python37/python.exe*
lrwxrwxrwx 1 root   root           9 Oct 25  2018 python3 -> python3.6*
-rwxr-xr-x 1 root   root        1018 Oct 29  2017 python3-jsondiff*
-rwxr-xr-x 1 root   root        3661 Oct 29  2017 python3-jsonpatch*
-rwxr-xr-x 1 root   root        1342 May  2  2016 python3-jsonpointer*
-rwxr-xr-x 1 root   root         398 Nov 16  2017 python3-jsonschema*
-rwxr-xr-x 2 root   root     4522328 Oct 22  2018 python3.6*
-rwxr-xr-x 2 root   root     4522328 Oct 22  2018 python3.6m*
lrwxrwxrwx 1 root   root          10 Oct 25  2018 python3m -> python3.6m*

一切顺利,接下来是见证奇迹的时刻:

zhangmh@LAPTOP-8507OGEN:/usr/bin$ python
zhangmh@LAPTOP-8507OGEN:/usr/bin$

发生了什么?真的是奇迹吗?python shell哪里去了?
思路1就这么无理由的失败了。

  • 思路2:将python安装目录添加到PATH中

别灰心,熟悉linux的我还有第二套方案。不就是要让Ubuntu找到python的安装目录嘛,我们可以修改环境变量啊。

zhangmh@LAPTOP-8507OGEN:/usr/bin$ sudo rm python
zhangmh@LAPTOP-8507OGEN:/usr/bin$ export PATH=$PATH:/mnt/c/Python37
zhangmh@LAPTOP-8507OGEN:/usr/bin$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/mnt/c/Program Files/ImageMagick-7.0.2-Q16:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/iCLS/:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/iCLS/:/mnt/c/windows/system32:/mnt/c/windows:/mnt/c/windows/System32/Wbem:/mnt/c/windows/System32/WindowsPowerShell/v1.0/:/mnt/c/windows/System32/OpenSSH/:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/IPT:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/IPT:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/ffmpeg-20190803-9af8ce7-win64-static/bin:/mnt/c/cmder_mini:/mnt/e/mingw64/bin:/mnt/c/Program Files/nodejs/:/mnt/c/ProgramData/chocolatey/bin:/mnt/e/nginx-1.17.7:/mnt/e/Apache24/bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/::/%JAVA_HOME%/bin:/mnt/c/Python37:/mnt/c/Python37/Scripts:/mnt/c/Users/zhang/AppData/Local/Programs/Fiddler:/mnt/c/Users/zhang/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Users/zhang/AppData/Local/Microsoft/WindowsApps:/snap/bin:/mnt/c/Python37

这回应该行了吧:

zhangmh@LAPTOP-8507OGEN:/usr/bin$ python

Command 'python' not found, but can be installed with:

sudo apt install python3
sudo apt install python
sudo apt install python-minimal

You also have python3 installed, you can run 'python3' instead.

没有?

zhangmh@LAPTOP-8507OGEN:/usr/bin$ python.exe
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

原来Ubunut不会替我省略“.exe”啊。这到是可以复制出来一个没有扩展名的python。可以我就添加其他的软件的话,比如vscode、notepad++、pycharm等等,难道都要复制一份吗?这不科学啊。
思路2又这样被流产。

  • 思路3:使用别名

这也不行,那也不行。只好祭出我的杀手锏了。别忘了,linux不还有别名嘛。

zhangmh@LAPTOP-8507OGEN:/usr/bin$ alias python=/mnt/c/Python37/python.exe
zhangmh@LAPTOP-8507OGEN:/usr/bin$ python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 

哈哈,久违的python shell,终于又见面了。赶紧添加到.bashrc中,重启WSL,验证。启动python没有任何问题。

别急,冷静,越是激动人心的时刻越要冷静。前面提到了在子系统中的路径与windows下的不一样。可不要在这种细节问题上翻车啊。

zhangmh@LAPTOP-8507OGEN:/mnt/c/Users/zhang$ python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> fp = open(r"d:\test\test.txt", "w")
>>> fp.write("hello wsl\n")
9
>>> fp.close()
>>> ^Z

zhangmh@LAPTOP-8507OGEN:/mnt/c/Users/zhang$ cd /mnt/d/test
zhangmh@LAPTOP-8507OGEN:/mnt/d/test$ cat test.txt
hello wsl
zhangmh@LAPTOP-8507OGEN:/mnt/d/test$

在windows上查看这个文件也对的令人发指。经过测试,即使运行wxpython创建的GUI程序,也是正确的。
同理,可以为pip、nodejs、vscode等创建别名。不过,如果安装目录中有空格就需要注意了,.bashrc中要这么写:

alias node="'/mnt/c/Program Files/nodejs/node.exe'"

按着Shift键在文件夹上点击右键,右键菜单里也会有
“在此处打开Linux Shell”菜单。点击可以启动WSL并进入当前目录。

使用wsl可以取代cmd和PowerShell。

搭载Windows Terminal的顺风车

WSL还是有着不完美的地方,如上面提到的右键菜单,一定要按着Shift键才能出现,查看注册表,发现“\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\WSL”键下面多了一个“Extended”如图:
在这里插入图片描述
可是这个键无法删除,即便是使用管理员身份打开注册表编辑器也不行。
好吧,既然是尝鲜,那不妨多尝试一些。微软又一个亲儿子Windows Terminal发布了一段时间了,虽然还是预览版,但社区的反响还是挺不错的。如果WSL能搭载Windows Terminal的顺风车,实用性应该能提高一个档次。
安装Windows Terminal是一件恶心人的事情,搞不懂为什么安装一个命令行工具还必须要升级操作系统。折腾了近三个小时,终于成功运行了Windows Terminal。详细安装过程我不再细表,有请度娘出场。

将WSL作为Windows Terminal的默认shell

Windows Terminal可以自动识别已经安装在WSL,只是它不是默认的加载项,如图:
在这里插入图片描述
当然,可以让它默认启动WSL,点击上图中的Settings,打开Windows Terminal的配置文件。
PS:如果是用记事本打开,你可以先在本地随便建一个扩展名为“.json”,然后设置它默认的打开方式为vscode或其他编辑器。
可以看到配置文件中有一行:

"defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}"

找到下面profiles.list中Ubuntu子系统的guid,替换到上面即可。

将Windows Terminal添加到文件夹的右键菜单中

WSL已经上了Windows Terminal的车,可是在文件夹上点右键也没有Windows Terminal啊?唉,Windows Terminal毕竟还是预览版,功能还不完善。不过没关系,谁让咱会用注册表啊。

  1. GitHub上面下载terminal.ico,将它保存到“
    系统盘:\Users\用户名\AppData\Local\Microsoft\WindowsApps”目录中
  2. 运行regeditor,打开注册表编辑器
  3. 依次进入“计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\”
  4. 在shell上点击右键,选择新建项:
    在这里插入图片描述
  5. 将新建的项命名为wt,并修改默认键的值为“在此处打开Windows Terminal”:
    在这里插入图片描述
  6. 在右侧空白处点击右键,选择新建字符串值:
    在这里插入图片描述
  7. 将新建的字符串命名为“Icon”,值设置为刚才保存的图标路径:
    在这里插入图片描述
  8. 根据步骤4、5的操作方法,创建“command”项,并将默认属性设置为与图标文件同目录的wt.exe:
    在这里插入图片描述
  9. 再次编辑Windows Terminal的配置文件,在ubuntu的项中添加一行““startingDirectory”: “./””:
    {
        "guid": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
        "hidden": false,
        "name": "Ubuntu-18.04",
        "source": "Windows.Terminal.Wsl",
        "startingDirectory": "./"
    }
    

经过以上步骤,在资源管理器的文件夹中点击右键,就可以直接打开Ubuntu子系统命令行,并定位到指定的路径下。

利用Windows Terminal美化WSL

关于Windows Terminal的美化,网上一大堆的帖子,个个都弄的非常漂亮。就我个人而言,不喜欢搞的花里花哨,能设置字体,搞个透明度对我来说就足够了。
美化的方法还在编辑Windows Terminal的配置文件中ubuntu项:

{
    "guid": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "hidden": false,
    "name": "Ubuntu-18.04",
    "source": "Windows.Terminal.Wsl",
    "fontFace": "Consolas",
    "fontSize": 14,
    "acrylicOpacity": 0.6,   // 不透明度,值越小越透明
    "useAcrylic": true,      // 启用亚格力特效
    "startingDirectory": "./"
}

提高屏幕的利用率

Windows Terminal不但支持分Tab页显示,在同一个Tab页内,还可以进行分屏。
按Alt、Shift和加号键可以对当前区域进行垂直分割,Alt、Shift和减号则是水平分割。
按ALT+Shift+上下左右可以调整分屏区域的大小。
分割后,可以按Alt加上下左右切换分屏。
遗憾的是,我没有找到取消分屏的方法。也话后序版本会支持吧。

使用zsh作为默认shell

Linux中哪个Shell最好用?不告诉你,不过我个人超喜欢zsh。它完全兼容bash,并提供了方便的功能:

  • 跳转目录不需要输入cd
  • 强大的tab选择功能
  • 拥有很多超级好用的插件

还等什么,赶紧在Ubuntu子系统中安装吧。

安装zsh和oh-my-zsh

  1. 安装zsh
    sudo apt install zsh
    
  2. 安装oh-my-zsh
    oh-my-zsh的安装需要从raw.githubusercontent.com下载文件,但是该站点……(你懂的)。要想连接,需要同时修改windows和Ubuntu子系统的两个hosts文件。在文件的末尾添加如下内容:
    # GitHub
    192.30.253.112  github.com
    192.30.253.119  gist.github.com
    151.101.100.133 assets-cdn.github.com
    151.101.100.133 raw.githubusercontent.com
    151.101.100.133 gist.githubusercontent.com
    151.101.100.133 cloud.githubusercontent.com
    151.101.100.133 camo.githubusercontent.com
    151.101.100.133 avatars0.githubusercontent.com
    151.101.100.133 avatars1.githubusercontent.com
    151.101.100.133 avatars2.githubusercontent.com
    151.101.100.133 avatars3.githubusercontent.com
    151.101.100.133 avatars4.githubusercontent.com
    151.101.100.133 avatars5.githubusercontent.com
    151.101.100.133 avatars6.githubusercontent.com
    151.101.100.133 avatars7.githubusercontent.com
    151.101.100.133 avatars8.githubusercontent.com
    
    然后raw.githubusercontent.com的证书貌似还出现了问题,需要跳过证书验证:
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -k)"
    
    安装过程中询问是否将zsh作为默认的shell,当然同意了,输入用户密码后,安装成功。

配置zsh主题

oh-my-zsh是一个zsh的配置工具,使用它可以方便的对zsh进行配置。

zsh有很多个主题可选,可以到https://github.com/ohmyzsh/ohmyzsh/wiki/themes看看每个主题的效果。
我比较喜欢使用agnoster,它与powerline字体简直是天作之合,显示效果超赞。但是我在Windows Terminal里试了几多种方法都不能正常显示。唉,预览版本就是问题多啊。无奈只有选择最清爽的avit了。
修改主目录下的.zshrc,搜索ZSH_THEME,将其修改为:

ZSH_THEME="avit"

然后加载配置:

source .zshrc

上图:
在这里插入图片描述
如果实在不知道选择哪个主题,可以配置为“random”,这样每次打开都随机选择一种主题,你可以每个都亲身体验一下,直到遇到一个可以相伴终身的,举行盛大的仪式将配置文件的主题固定下来。

使用zsh插件

oh-my-zsh安装好后,已经内置了非常多的插件,多到什么程度?你可以看一下oh-my-zsh的plugin目录:
在这里插入图片描述
在.zshrc中,可以配置使用哪些插件。默认只启用了git插件:

plugins=(git)

你可以添加多个插件,用空格隔开:

plugins=(git extract z)
  • git
    git插件是默认安装并且默认开启的,它为git命令添加了许多别名,以方便git的使用,常用的有:
    别名命令
    ggit
    ghhgit help
    gagit add
    gbgit branch
    gbagit branch -a
    gbdgit branch -d
    gcgit commit -v
    gc!git commit -v --amend
    gcamgit commit -a -m
    gcsmgit commit -s -m
    gcogit checkout
    gcmgit checkout master
    gcdgit checkout develop
    gfgit fetch
    gglgit pull origin
    ggpgit push origin
    ggpnpggl && ggp
    不够用?好吧,查一下更多
  • extract
    extract是一个强大到不要不要的解压插件。有了它,你再也不用记忆tar/unzip/unrar等命令是什么样的,直接一键x搞定:
    在这里插入图片描述
  • z
    z是一个非常强大的目录切换插件,它能记住你曾经进入过的目录,下次想要进入时,只需要输入目录的一部分,它会通过模糊检索自动进入你想要的目录。
  • zsh-autosuggestions
    虽然oh-my-zsh已经安装了非常多的插件,但依然有很多优秀的搬个没有被集成。zsh-autosuggestions就是其中之一,我们需要手动安装它。为了方便使用oh-my-zsh管理它,需要将其安装到oh-my-zsh的plugin目录下:
    git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/plugins/zsh-autosuggestions
    chmod 755 ~/.oh-my-zsh/plugins/zsh-autosuggestions
    
    然后修改.zshrc的插件配置:
    plugins=(git extract z zsh-autosuggestions)
    
    重新加载配置:
    source .zshrc
    
    下次再输入命令时:
    在这里插入图片描述
    你会发现你输入的字符是白色的,后面还有灰色的字符提示你曾经执行过的命令。此时直接回车灰色的字符是不生效的,按上下方向键,可以在所有以白色字符开头的命令中选择,找到你想要的命令后,按右方向键,可以选定该命令,再回车时,即可执行该命令
  • zsh-syntax-highlighting
    还在为不小心输错了命令面烦恼吗?使用zsh-syntax-highlighting吧,当它发现你的命令不可用时,会显示红色,命令可用时显示为绿色,命令对不对从此一目了然。当然,它也不是默认的,可以用上面的方法手工安装。

后记

借助Ubuntu子系统强大的命令系统,可以使windows的工作效率提升一个台阶。使用过程中,还会有很多好用的功能,等待我们去发现,去折腾。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值