goreliu
V2EX  ›  Windows

更好地使用 Windows Subsystem for Linux (或者叫 Bash on Ubuntu on Windows)终端环境

  •  
  •   goreliu · Aug 20, 2016 · 18737 views
    This topic created in 3575 days ago, the information mentioned may be changed or developed.

    Windows 10 中包含了一个 WSL ( Windows Subsystem for Linux )子系统,我们可以在其中运行未经修改过的原生 Linux ELF 可执行文件。利用它我们可以做很多事情,对开发人员和普通用户都是如此。当然对开发人员的吸引力更大一些,因为这意味着在一些情况,不再需要使用 Linux 虚拟机、双系统、 Cygwin/MSYS2 了。

    当前版本( 14901.1000 ) Windows 10 中的 WSL 功能已经比较完善了,和刚出来时不可同日而语,也不再是一个没有实用价值的玩具了(最初的版本连 zsh 和 tmux 等最基本的工具都无法运行,基本没有可用性。但如果现在依然说 WSL 不可用,就有失偏颇了)。但对不想折腾的普通用户来说,用户体验并不好。比如中文显示有问题,不支持中文输入,只支持 16 种颜色,不能隐藏滚动条,不兼容某些命令的输出,不能定制主题和一些其他按键相关配置等。

    用过 Cygwin/MSYS2 的朋友都清楚有个名叫 mintty 的终端模拟器,体积小巧配置简单,功能也够用,如果能直接用 mintty 作为 WSL 的终端模拟器,用户体验就好很多了。wsl-terminal 让这成为可能。

    wsl-terminal 支持如下功能:

    1. 优秀的兼容性(中文显示/输入、 24 位颜色、命令输出等都正常了)。
    2. 体积小巧,压缩包仅 1.7 M 多,解压后不到 10 M 。
    3. 配置简单, mintty 可以直接在标题栏右键配置, wsl-terminal 的配置文件也很简单。
    4. 可以直接在资源管理器右键打开终端模拟器并定位到当前目录。
    5. 可以将 .sh/.py/.pl 脚本关联到用 wsl-terminal 运行。
    6. 可以将文本文件关联到用 wsl-terminal 里的 vim 运行。
    7. 支持 tmux ,可以在 tmux 里打开新目录,恢复已有的 tmux 会话等。
    8. 支持在 WSL 里直接运行 Windows 程序。

    使用方法:

    1. https://github.com/goreliu/wsl-terminal/releases 下载 7z 格式的发布包。
    2. 解压后,直接运行 open-wsl.exe 即可在当前目录打开(可以关联到快捷键)。
    3. 可以运行 tools/add-open-wsl-here-menu.js 在资源管理器右键菜单里添加一个 Open WSL Here 菜单(tools/remove-open-wsl-here-menu.js 删除菜单)。
    4. 可以修改 .sh/.py/.pl/.php 等各种脚本的打开方式为 run-wsl-file.exe ,双击就可以打开。如果需要看结果的话,记得脚本最后加个 sleep 或者 read 。
    5. 可以修改文本文件的打开方式为 vim.exe ,双击就可以用 WSL 里的 vim 打开编辑。
    6. 如果想做 WSL 里边运行 Windows 的软件,运行 outbash-daemon.js ,然后把 bin 里的 wrun 、wstart 、wcmd 复制到 /usr/local/bin (可以直接运行 install_cbwin.sh ),然后 wstart notepad 就可以打开记事本了。cbwin 使用文档: https://github.com/xilun/cbwin
    7. 如果需要使用 tmux,在编辑文件里启用 use_tmux 即可。
    56 replies    2017-09-20 08:19:41 +08:00
    kindjeff
        1
    kindjeff  
       Aug 20, 2016
    前面是不是在知乎摘抄的,好像见过。
    我在用 cmder 。然而还是有一点不爽的就是没法直接在 ubuntu on windows 上用 IDE 因为装不上桌面环境。发现 gevent 在 windows 上貌似运行的不怎么好,为了在 linux 上用 IDE ,于是最后还是装了个 ubuntu 。
    hjc4869
        2
    hjc4869  
       Aug 20, 2016
    @kindjeff 如果只是运行 IDE 可以尝试使用 VcXsrv/Xming/Cygwin-X ,在 Ubuntu 环境里把$DISPLAY 设置为 127.0.0.1:0
    eamars
        3
    eamars  
       Aug 20, 2016
    oh-my-zsh 好像可以正常工作了哦

    kindjeff
        4
    kindjeff  
       Aug 20, 2016
    @hjc4869 是压根不支持桌面环境吧,反正用 VNC 试了一下午都没成功,尝试了各种桌面。
    goreliu
        5
    goreliu  
    OP
       Aug 20, 2016
    @kindjeff 知乎那个也是我写的,省事就没改,这个 wsl-terminal 也是……
    goreliu
        6
    goreliu  
    OP
       Aug 20, 2016
    @kindjeff VcXsrv/Xming 我试过, Xming 不推荐,启动速度比较慢。 VcXsrv 还好,有的软件能运行成功(比如 xterm 、 st 、 gedit ),有的有问题(比如基于 vte3 的各种终端)。基本上如果用 IDE 的话还是 Windows 本地的比较好,不然性能还是有问题,不知道后续各 IDE 会不会考虑支持 WSL 。
    goreliu
        7
    goreliu  
    OP
       Aug 20, 2016
    @eamars 嗯,大概第二个内部预览版 zsh 就正常了,之前我一直在等中文支持,等了几个月等不及了才找各种办法。
    ifoolish
        8
    ifoolish  
       Aug 20, 2016 via iPhone
    在用 cmder ,也挺好用的主要是支持多标签,但是 cmder 里 VIM 的配色很难看,回头试试楼主说的这个
    hronro
        9
    hronro  
       Aug 20, 2016
    我现在用 cmder 也用的蛮好的
    Tink
        10
    Tink  
    PRO
       Aug 20, 2016
    这个东西到底是哪个版本能更新上来,我现在 14393.51 没这个东西
    xy19009188
        12
    xy19009188  
       Aug 20, 2016 via Android
    mark
    goreliu
        13
    goreliu  
    OP
       Aug 20, 2016
    @hronro 这个在 shell 退格删除中文有问题,在 vim 中文宽度不对,只支持 16 种颜色。另外启动速度、资源占用都不如 wsl-terminal 。
    goreliu
        14
    goreliu  
    OP
       Aug 20, 2016
    @hronro 其实只用 WSL 的话, ConEmu 反而比基于它开发的 cmder 好些, ConEmu 内置了 bash.exe 的菜单,启动速度也要快一些。
    zaishanfeng
        15
    zaishanfeng  
       Aug 20, 2016 via Android
    这个东西可以作为开发环境吗
    goreliu
        16
    goreliu  
    OP
       Aug 20, 2016
    @zaishanfeng 要看开发什么,如果使用的工具没遇到 bug 大概是可以的。我遇到的问题列表,里边都是不能正常跑的程序,可以参考一下:

    1. script
    2. fakeroot
    3. socat UNIX-LISTEN:aa -
    4. ltrace
    5. valgrind
    6. chroot
    7. dig: 能运行和显示结果,但有错误提示 setsockopt(20, IP_RECVTOS) failed: Invalid argument
    8. screen
    9. nginx
    10. ping
    11. tracepath
    12. /proc/sys/fs/binfmt_misc
    13. 依赖 inotify 的工具
    14. fish
    xupefei
        17
    xupefei  
       Aug 21, 2016
    @goreliu dig, tracepath 和 ping 的问题都可以通过管理员运行 bash.exe 解决。目前这在官方还是个已知 bug 。
    goreliu
        18
    goreliu  
    OP
       Aug 21, 2016
    @xupefei 但用管理员运行还是比较麻烦和危险的。
    tan90ds
        19
    tan90ds  
       Aug 22, 2016
    给楼主提个意见: GitHub 主页上的截图配色实在是太难看了
    tan90ds
        20
    tan90ds  
       Aug 22, 2016
    没打完就发出去了… 楼主可以换一个 colorscheme 重新截图,比如我用的这个 gruvbox 。

    ForegroundColour=235,219,178
    BackgroundColour=29,32,33
    CursorColour=235,219,178
    Black=40,40,40
    BoldBlack=146,131,116
    Red=204,36,29
    BoldRed=251,73,62
    Green=152,151,26
    BoldGreen=184,187,38
    Yellow=215,153,33
    BoldYellow=250,189,47
    Blue=69,133,136
    BoldBlue=131,165,152
    Magenta=177,98,134
    BoldMagenta=211,134,155
    Cyan=104,157,106
    BoldCyan=142,192,124
    White=168,153,132
    BoldWhite=235,219,178

    这个终端很好用!立刻从小毛病不断的 ConEmu 换过来了。
    goreliu
        21
    goreliu  
    OP
       Aug 22, 2016
    @tan90ds 审美这个好像因人而异,现在预置了 40 多个主题,你看 https://github.com/goreliu/wsl-terminal/wiki/Screenshots 里边有没有比较好看的。
    tan90ds
        22
    tan90ds  
       Aug 22, 2016
    @goreliu 但是你看 cmder 和 ConEmu 的主页的截图,人家都不会用类似 #FF0000 这样的颜色… 在大家都习惯了类似 solarized 这样的配色的年代,还是要注意一下宣传效果的哈 ;)
    goreliu
        23
    goreliu  
    OP
       Aug 22, 2016
    @tan90ds 如果作为编辑器的话, solarized 这样的配色不错,但作为终端模拟器的话,得照顾其他命令的输出。默认的 16 种颜色都是有名称的, black 就是黑色, green 就是绿色,改成这样的话,颜色全部不对了。如果只在 vim 里用可以只改 vim 的主题。而且 Linux 用户对终端颜色的审美真的和 Windows 用户不一样。
    ifoolish
        24
    ifoolish  
       Aug 22, 2016
    楼主,这个如何设置将 zsh 作为默认 shell ?
    goreliu
        25
    goreliu  
    OP
       Aug 22, 2016
    @ifoolish 编辑 etc/wsl-terminal.conf ,把 shell 改成 zsh 。
    ifoolish
        26
    ifoolish  
       Aug 22, 2016
    @goreliu 发现 zsh 的箭头→显示不正常
    goreliu
        27
    goreliu  
    OP
       Aug 22, 2016
    @ifoolish 这个是怎么配置的,用的是哪个符号,哪个字体。
    goreliu
        28
    goreliu  
    OP
       Aug 22, 2016
    @ifoolish 换个字体呢,我试 Consolas 和 DejaVu Sans Mono 都是正常的,我自己用的 Inziu Iosevka Sc 也正常。
    ifoolish
        29
    ifoolish  
       Aug 22, 2016 via iPhone
    @goreliu 应该不是字体问题,换其他字体还是如此
    ifoolish
        30
    ifoolish  
       Aug 22, 2016 via iPhone
    @goreliu 对了,我是 zsh 加上 Oh-my-zsh 的配置
    goreliu
        31
    goreliu  
    OP
       Aug 22, 2016
    @ifoolish ➜这个符号确实显示不全,→是正常的。
    goreliu
        32
    goreliu  
    OP
       Aug 22, 2016
    @goreliu 还有一些其他的符号也显示不正常,感觉是字体或者编码相关的问题,这种符号在等宽字体下,宽度既不是一个字母的宽度,也不是两个字母的宽度,即使终端模拟器特别处理下能显示全,也是对不齐的,会有其他问题。
    goreliu
        33
    goreliu  
    OP
       Aug 22, 2016
    @ifoolish 还是字体的问题,如果字体里的这个符号不是一个字符宽度的,会被截断成一个字符。 DejaVu Sans Mono 字体能显示正常。如果在这种情况强行显示,会导致等宽字体也对不齐,所以截断了。
    ifoolish
        34
    ifoolish  
       Aug 22, 2016 via iPhone
    @goreliu 但是在 msys2 和 babun 带的 mintty 中都能正常显示的呢
    goreliu
        35
    goreliu  
    OP
       Aug 22, 2016
    @ifoolish 我这里试和 msys2 自带的 mintty 行为是一样的。看下是不是字体设置的不一样。
    ifoolish
        36
    ifoolish  
       Aug 22, 2016
    @goreliu 可能我没说清楚,其实我是指在 msys2 里那个箭头显示没问题,不是指用 msys2 自带的那个 mintty 配上 WSL 没问题
    goreliu
        37
    goreliu  
    OP
       Aug 22, 2016 via Android
    @ifoolish 我指的也是在 msys2 的环境里,新安装的以及安装后把 msys2 升级到最新版都是一样的。要不你发下你字体我试下。
    ifoolish
        38
    ifoolish  
       Aug 23, 2016
    @goreliu 用的就是默认的 Consolas 字体,我在两台电脑装了 msys2 和 wsl-terminal ,都是 msys2 显示没问题 wsl-terminal 就不行
    goreliu
        39
    goreliu  
    OP
       Aug 23, 2016
    @ifoolish 我这里是一样的,上边的是 msys2 的,新下载的,只把 mintty 更新到最新的 2.4.0 ,然后字体改成 Consolas 14 。下边的是 wsl-terminal ,字体也是 Consolas 14 。

    ![]( )
    ifoolish
        40
    ifoolish  
       Aug 23, 2016
    @goreliu 看来是 mintty 新版本的问题,原来我的 msys2 的 mintty 是 2.3.x 版本, babun 的也是,显示箭头是没问题的,你这么一说我就用 pacman 更新 mintty 到了 2.4.0 ,果然显示不全了
    goreliu
        41
    goreliu  
    OP
       Aug 23, 2016
    @ifoolish 我试过老版本,显示效果是不一样,但也存在问题。主要原因还是字体里这个符号宽度不对,显示全了就会错位,或者整体向后移动,都挺别扭的。不如改下字体里的这个符号(也可能是字体里没有, fallback 到其他字体导致的),或者换个符号。
    hronro
        42
    hronro  
       Aug 25, 2016
    试用了一下,貌似我这边显示中文还是有问题

    goreliu
        43
    goreliu  
    OP
       Aug 26, 2016
    @hronro 你用的是什么字体,默认字体也一样吗?
    hronro
        44
    hronro  
       Aug 27, 2016
    字体是 Courier New ,你所谓的默认字体是指?
    反正我用 Consolas 也是一样的效果
    goreliu
        45
    goreliu  
    OP
       Aug 27, 2016
    @hronro 在我这里两个字体都正常,没遇到你说的情况。
    hronro
        46
    hronro  
       Aug 27, 2016
    @goreliu 我用的是英文版的操作体统,估计是英文版的 WIN10 ,中文字体的 fallback 不一样
    goreliu
        47
    goreliu  
    OP
       Aug 27, 2016
    @hronro 那有可能,可以换个中文字体试试。
    crytis
        48
    crytis  
       Dec 2, 2016
    楼主还在一直更新呐 好顶赞。
    ps windows 下的各种终端是不是都没法达到 on my zsh 主题截图的效果,比如 ys ,只有 mac 下可以?
    blueboyggh
        49
    blueboyggh  
       Apr 11, 2017
    这个能不能默认打开的时候直接定位到 WSL 的用户文件夹下?就是直接 bash ~
    Shawnone
        50
    Shawnone  
       Jul 3, 2017
    @goreliu 运行 open-wsl.exe 后窗口一闪而过就退出了是什么情况?
    mortence
        51
    mortence  
       Jul 17, 2017
    @goreliu 我运行了也是 @Shawnone 一样的情况,应该怎么解决呢
    iamfredng
        52
    iamfredng  
       Aug 2, 2017
    @mortence @Shawnone 这个是因为 wslbridge.exe 和 wslbridge-backend 两个文件的版本是旧的 0.2.2,可以去 https://github.com/rprichard/wslbridge/releases/tag/0.2.3 这里下载 0.2.3 来代替 bin 目录下的同名文件。我用的 cygwin64 版本的压缩包
    mortence
        53
    mortence  
       Aug 3, 2017
    @iamfredng 我把 ubuntu 从 14 升到 16,已经可以正常使用了
    goreliu
        54
    goreliu  
    OP
       Sep 18, 2017
    最近几天更新了很多功能:
    https://www.sunp.eu.org/t/391405
    runapp
        55
    runapp  
       Sep 19, 2017
    能够操作 raw_socket 本身就是很危险的行为,linux 下 traceroute 是需要 root 权限的。ping 倒是不需要……
    goreliu
        56
    goreliu  
    OP
       Sep 20, 2017
    @runapp WSL 是不支持 traceroute 的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   996 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 19:12 · PVG 03:12 · LAX 12:12 · JFK 15:12
    ♥ Do have faith in what you're doing.