V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
goreliu
V2EX  ›  Windows

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

  •  
  •   goreliu · 2016-08-20 14:31:53 +08:00 · 17720 次点击
    这是一个创建于 3042 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条回复    2017-09-20 08:19:41 +08:00
    kindjeff
        1
    kindjeff  
       2016-08-20 15:16:02 +08:00
    前面是不是在知乎摘抄的,好像见过。
    我在用 cmder 。然而还是有一点不爽的就是没法直接在 ubuntu on windows 上用 IDE 因为装不上桌面环境。发现 gevent 在 windows 上貌似运行的不怎么好,为了在 linux 上用 IDE ,于是最后还是装了个 ubuntu 。
    hjc4869
        2
    hjc4869  
       2016-08-20 15:19:23 +08:00
    @kindjeff 如果只是运行 IDE 可以尝试使用 VcXsrv/Xming/Cygwin-X ,在 Ubuntu 环境里把$DISPLAY 设置为 127.0.0.1:0
    eamars
        3
    eamars  
       2016-08-20 15:34:31 +08:00
    oh-my-zsh 好像可以正常工作了哦

    kindjeff
        4
    kindjeff  
       2016-08-20 15:40:12 +08:00
    @hjc4869 是压根不支持桌面环境吧,反正用 VNC 试了一下午都没成功,尝试了各种桌面。
    goreliu
        5
    goreliu  
    OP
       2016-08-20 15:44:52 +08:00
    @kindjeff 知乎那个也是我写的,省事就没改,这个 wsl-terminal 也是……
    goreliu
        6
    goreliu  
    OP
       2016-08-20 15:49:55 +08:00
    @kindjeff VcXsrv/Xming 我试过, Xming 不推荐,启动速度比较慢。 VcXsrv 还好,有的软件能运行成功(比如 xterm 、 st 、 gedit ),有的有问题(比如基于 vte3 的各种终端)。基本上如果用 IDE 的话还是 Windows 本地的比较好,不然性能还是有问题,不知道后续各 IDE 会不会考虑支持 WSL 。
    goreliu
        7
    goreliu  
    OP
       2016-08-20 15:53:27 +08:00
    @eamars 嗯,大概第二个内部预览版 zsh 就正常了,之前我一直在等中文支持,等了几个月等不及了才找各种办法。
    ifoolish
        8
    ifoolish  
       2016-08-20 18:47:17 +08:00 via iPhone
    在用 cmder ,也挺好用的主要是支持多标签,但是 cmder 里 VIM 的配色很难看,回头试试楼主说的这个
    hronro
        9
    hronro  
       2016-08-20 19:32:54 +08:00
    我现在用 cmder 也用的蛮好的
    Tink
        10
    Tink  
       2016-08-20 19:39:15 +08:00
    这个东西到底是哪个版本能更新上来,我现在 14393.51 没这个东西
    xy19009188
        12
    xy19009188  
       2016-08-20 20:14:06 +08:00 via Android
    mark
    goreliu
        13
    goreliu  
    OP
       2016-08-20 20:35:00 +08:00
    @hronro 这个在 shell 退格删除中文有问题,在 vim 中文宽度不对,只支持 16 种颜色。另外启动速度、资源占用都不如 wsl-terminal 。
    goreliu
        14
    goreliu  
    OP
       2016-08-20 20:38:39 +08:00
    @hronro 其实只用 WSL 的话, ConEmu 反而比基于它开发的 cmder 好些, ConEmu 内置了 bash.exe 的菜单,启动速度也要快一些。
    zaishanfeng
        15
    zaishanfeng  
       2016-08-20 20:41:56 +08:00 via Android
    这个东西可以作为开发环境吗
    goreliu
        16
    goreliu  
    OP
       2016-08-20 20:50:20 +08:00
    @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  
       2016-08-21 05:15:26 +08:00
    @goreliu dig, tracepath 和 ping 的问题都可以通过管理员运行 bash.exe 解决。目前这在官方还是个已知 bug 。
    goreliu
        18
    goreliu  
    OP
       2016-08-21 08:42:19 +08:00
    @xupefei 但用管理员运行还是比较麻烦和危险的。
    tan90ds
        19
    tan90ds  
       2016-08-22 06:48:33 +08:00
    给楼主提个意见: GitHub 主页上的截图配色实在是太难看了
    tan90ds
        20
    tan90ds  
       2016-08-22 06:51:09 +08:00
    没打完就发出去了… 楼主可以换一个 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
       2016-08-22 07:13:16 +08:00
    @tan90ds 审美这个好像因人而异,现在预置了 40 多个主题,你看 https://github.com/goreliu/wsl-terminal/wiki/Screenshots 里边有没有比较好看的。
    tan90ds
        22
    tan90ds  
       2016-08-22 07:56:17 +08:00
    @goreliu 但是你看 cmder 和 ConEmu 的主页的截图,人家都不会用类似 #FF0000 这样的颜色… 在大家都习惯了类似 solarized 这样的配色的年代,还是要注意一下宣传效果的哈 ;)
    goreliu
        23
    goreliu  
    OP
       2016-08-22 08:07:58 +08:00
    @tan90ds 如果作为编辑器的话, solarized 这样的配色不错,但作为终端模拟器的话,得照顾其他命令的输出。默认的 16 种颜色都是有名称的, black 就是黑色, green 就是绿色,改成这样的话,颜色全部不对了。如果只在 vim 里用可以只改 vim 的主题。而且 Linux 用户对终端颜色的审美真的和 Windows 用户不一样。
    ifoolish
        24
    ifoolish  
       2016-08-22 14:50:02 +08:00
    楼主,这个如何设置将 zsh 作为默认 shell ?
    goreliu
        25
    goreliu  
    OP
       2016-08-22 15:39:40 +08:00
    @ifoolish 编辑 etc/wsl-terminal.conf ,把 shell 改成 zsh 。
    ifoolish
        26
    ifoolish  
       2016-08-22 17:54:16 +08:00
    @goreliu 发现 zsh 的箭头→显示不正常
    goreliu
        27
    goreliu  
    OP
       2016-08-22 18:10:40 +08:00
    @ifoolish 这个是怎么配置的,用的是哪个符号,哪个字体。
    goreliu
        28
    goreliu  
    OP
       2016-08-22 18:14:46 +08:00
    @ifoolish 换个字体呢,我试 Consolas 和 DejaVu Sans Mono 都是正常的,我自己用的 Inziu Iosevka Sc 也正常。
    ifoolish
        29
    ifoolish  
       2016-08-22 21:57:00 +08:00 via iPhone
    @goreliu 应该不是字体问题,换其他字体还是如此
    ifoolish
        30
    ifoolish  
       2016-08-22 21:58:46 +08:00 via iPhone
    @goreliu 对了,我是 zsh 加上 Oh-my-zsh 的配置
    goreliu
        31
    goreliu  
    OP
       2016-08-22 22:21:42 +08:00
    @ifoolish ➜这个符号确实显示不全,→是正常的。
    goreliu
        32
    goreliu  
    OP
       2016-08-22 22:29:57 +08:00
    @goreliu 还有一些其他的符号也显示不正常,感觉是字体或者编码相关的问题,这种符号在等宽字体下,宽度既不是一个字母的宽度,也不是两个字母的宽度,即使终端模拟器特别处理下能显示全,也是对不齐的,会有其他问题。
    goreliu
        33
    goreliu  
    OP
       2016-08-22 22:36:57 +08:00
    @ifoolish 还是字体的问题,如果字体里的这个符号不是一个字符宽度的,会被截断成一个字符。 DejaVu Sans Mono 字体能显示正常。如果在这种情况强行显示,会导致等宽字体也对不齐,所以截断了。
    ifoolish
        34
    ifoolish  
       2016-08-22 22:43:00 +08:00 via iPhone
    @goreliu 但是在 msys2 和 babun 带的 mintty 中都能正常显示的呢
    goreliu
        35
    goreliu  
    OP
       2016-08-22 23:04:11 +08:00
    @ifoolish 我这里试和 msys2 自带的 mintty 行为是一样的。看下是不是字体设置的不一样。
    ifoolish
        36
    ifoolish  
       2016-08-22 23:29:03 +08:00
    @goreliu 可能我没说清楚,其实我是指在 msys2 里那个箭头显示没问题,不是指用 msys2 自带的那个 mintty 配上 WSL 没问题
    goreliu
        37
    goreliu  
    OP
       2016-08-22 23:47:40 +08:00 via Android
    @ifoolish 我指的也是在 msys2 的环境里,新安装的以及安装后把 msys2 升级到最新版都是一样的。要不你发下你字体我试下。
    ifoolish
        38
    ifoolish  
       2016-08-23 10:05:49 +08:00
    @goreliu 用的就是默认的 Consolas 字体,我在两台电脑装了 msys2 和 wsl-terminal ,都是 msys2 显示没问题 wsl-terminal 就不行
    goreliu
        39
    goreliu  
    OP
       2016-08-23 10:31:30 +08:00
    @ifoolish 我这里是一样的,上边的是 msys2 的,新下载的,只把 mintty 更新到最新的 2.4.0 ,然后字体改成 Consolas 14 。下边的是 wsl-terminal ,字体也是 Consolas 14 。

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

    goreliu
        43
    goreliu  
    OP
       2016-08-26 08:00:04 +08:00
    @hronro 你用的是什么字体,默认字体也一样吗?
    hronro
        44
    hronro  
       2016-08-27 15:51:27 +08:00
    字体是 Courier New ,你所谓的默认字体是指?
    反正我用 Consolas 也是一样的效果
    goreliu
        45
    goreliu  
    OP
       2016-08-27 16:27:30 +08:00
    @hronro 在我这里两个字体都正常,没遇到你说的情况。
    hronro
        46
    hronro  
       2016-08-27 22:11:16 +08:00
    @goreliu 我用的是英文版的操作体统,估计是英文版的 WIN10 ,中文字体的 fallback 不一样
    goreliu
        47
    goreliu  
    OP
       2016-08-27 22:23:20 +08:00
    @hronro 那有可能,可以换个中文字体试试。
    crytis
        48
    crytis  
       2016-12-02 15:16:53 +08:00
    楼主还在一直更新呐 好顶赞。
    ps windows 下的各种终端是不是都没法达到 on my zsh 主题截图的效果,比如 ys ,只有 mac 下可以?
    blueboyggh
        49
    blueboyggh  
       2017-04-11 09:58:20 +08:00
    这个能不能默认打开的时候直接定位到 WSL 的用户文件夹下?就是直接 bash ~
    Shawnone
        50
    Shawnone  
       2017-07-03 17:32:58 +08:00
    @goreliu 运行 open-wsl.exe 后窗口一闪而过就退出了是什么情况?
    mortence
        51
    mortence  
       2017-07-17 14:16:44 +08:00
    @goreliu 我运行了也是 @Shawnone 一样的情况,应该怎么解决呢
    iamfredng
        52
    iamfredng  
       2017-08-02 05:12:36 +08:00
    @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  
       2017-08-03 19:19:56 +08:00
    @iamfredng 我把 ubuntu 从 14 升到 16,已经可以正常使用了
    goreliu
        54
    goreliu  
    OP
       2017-09-18 10:50:14 +08:00
    最近几天更新了很多功能:
    https://www.v2ex.com/t/391405
    runapp
        55
    runapp  
       2017-09-19 22:48:19 +08:00
    能够操作 raw_socket 本身就是很危险的行为,linux 下 traceroute 是需要 root 权限的。ping 倒是不需要……
    goreliu
        56
    goreliu  
    OP
       2017-09-20 08:19:41 +08:00
    @runapp WSL 是不支持 traceroute 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:21 · PVG 04:21 · LAX 12:21 · JFK 15:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.