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

yori,一个提升 windows 命令行使用体验的 shell(cmd 替代)

  •  
  •   codehz · 2020-11-27 20:57:47 +08:00 · 3661 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先回顾一下已知 win 上的几大主流命令行 shell (指在主要 win 下使用,操作 win 的资源,不包括直接弃疗用 wsl )

    1. cmd
    2. PowerShell
    3. (各种来源的,非 wsl ) bash

    cmd 自然是没得说,即使微软主推 ps,也没彻底汰换掉 cmd.exe ,还是有不少朋友喜欢使用。 启动速度快,兼容性广泛都是它的优点。 当然,缺陷也是非常之多, 比如没有方便的宏 /alias 机制; 万恶的 终止批处理操作吗(Y/N)? ; 以及没有内建的多任务管理功能等待; 再加上已经官宣不再更新了,所以也不可能再有改进的机会。

    PowerShell 大概属于现代 shell 的一员了,各种特性也给的很全。 包括现在支持各种 readline 的快捷键和命令补全。 命令基本上都是自解释性的,还能嵌入 C#实现功能扩展。 缺陷则主要集中在: 启动速度过慢(即使没有写用户配置,都有肉眼可见的启动延迟,但是怎么可能不写用户配置呢,这样一来,加载时间基本都短不了); 命令约定和常规的 unix 风格和 dos 风格都不搭; 用对象做管道传递,但是和传统程序不兼容 (以至于传输常规文本的性能都比较捉急,最终的效果就是给人一种卡卡的感觉), 相比之下 PowerShell 更适合编写长期使用的脚本,而非交互式使用。

    接下来就是知名的 bash,很多人可能都是通过 git for windows 或者 msys2 获取的,伴随而来的是一整套 unix 常见工具链。 对于相关开发的人来说是属于比较友好的。 而缺陷在于: 路径格式不一致,win 的目录分割符不兼容, 管道里还可以通过 cygpath 转换,但是复制粘贴的时候就麻烦了; 除此之外,由于使用的是 c 库函数,所以目录长度受限于 260 的路径限制, 在一些场景会报错 File name too long ; 最后,由于每次按下回车都会创建好多个进程生成 PROMPT, 但是 windows 创建进程速度极慢,给人也是一种卡卡的感觉。

    (讽刺的是 Git for windows 是默认支持长文件名的,但是附带的 bash 却没有,这就导致了各种诡异的问题)

    我相信只要有过一段时间使用 windows 命令行接口的用户,都会有类似的感受吧。

    其实很多时候大家只是需要一个能在 cmd 基础上增强的工具而已, 这里有一个选项:clink,通过 hook cmd 来实现扩展, 但是我这边是处于一直无法使用的尴尬状态 ( 64 位一直 hook 不成功,32 位可以,但是 32 位的 cmd 会受到 WoW64 重定向的影响)。 然后它实际上也没有解决全部的问题, 比如该缺的工具还是缺 (虽然可以通过 msys2 来补充,但是上面说的路径问题还是影响比较大的)。

    然后某次不经意间发现了 yori 发现这玩意真就瞄着 cmd 的痛点去的,各种角度看都是 cmd 的增强,这条路算是比较正常的路线,而不是 unix 工具的移植(毕竟,真要用 linux 的时候都是直接实机装 linux,远程或者 wsl 了,谁还用 windows 啊)

    目前简单用下来发现有如下几个特性:

    1. 中文支持还行,最好切到 utf-8 模式(
    2. 可以使用类似反引号(` `)将里面的命令的执行结果引出来
    3. 支持管理后台任务,使用 & 创建,而 &! 则会创建后搜集命令的执行结果,可以用 job X output 查看,这个看起来对脚本很友好
    4. tab 补全不仅可以补全命令,还可以在长命令行的中间开始补全,而不会把后面的参数也吞掉,支持多种补全模式,还能类似其他 shell 一样自定义命令的补全
    5. 支持 bash 风格的 filename.{ext1,ext2} 展开文件名,这个非常棒,重命名文件很有效
    6. 可以用 ~ 来指代家目录了,还有 ~Documents 扩展打开我的文档(和 bash 不一样,但是考虑到 windows 很少人会真的使用多个账户,这个改动我觉得是合理的)
    7. 正确实现的 alias,而不是 doskey 那种只看开头的暴力替换
    8. 可以映射 F1-F12 功能键
    9. 命令历史可以保存
    10. 内置指令可以扩展,因为实际上就是加载 dll 文件然后执行指定的函数(后缀名要求为 com )
    11. 自带一个编码转换工具 iconv (默认编码 UTF-8 )
    12. 甚至支持 cd 到 WSL 的路径 \\wsl\YourDistro
    13. 在 win10 以下会帮你扩展 VT100 的属性到 windows console api
    14. bat 兼容,指可以在执行完 bat 后导出其中设置的环境变量,这样就可以直接使用 vs 的环境变量加载了

    完整安装的话,还有 80 多款自带工具,包括部分 unix 兼容的,和对 win32 的控制台命令扩展的,均可以使用 -?/? 获取帮助

    (如果使用 windows terminal,部分功能会无法使用,主要是那些涉及 cmd 窗口扩展的,比如 quickedit 模式增强功能)

    15 条回复    2020-11-29 01:05:30 +08:00
    Jirajine
        1
    Jirajine   2020-11-27 21:16:53 +08:00 via Android
    除了 msys2+zsh 这样伪 POSIX 的之外,也可以用 elvish 等 non-posix complaint shell 。
    ysc3839
        2
    ysc3839   2020-11-28 00:16:19 +08:00
    > 路径格式不一致,win 的目录分割符不兼容, 管道里还可以通过 cygpath 转换,但是复制粘贴的时候就麻烦了

    推荐 ConEmu,粘贴时会自动转换。
    codehz
        3
    codehz   2020-11-28 00:30:35 +08:00 via Android
    @ysc3839 (还有一个问题:260 目录长度限制)
    zlowly
        4
    zlowly   2020-11-28 01:10:14 +08:00
    不知道使用起来和 Take Command 比起来如何?当然 Take Command 是作为命令行解释器和 shell 在本质上不同,不过作为用户我们往往只关注使用效果。
    codehz
        5
    codehz   2020-11-28 01:17:54 +08:00 via Android
    @zlowly 这个要加钱)
    zhuangzhuang1988
        6
    zhuangzhuang1988   2020-11-28 01:29:18 +08:00
    直接 windows terminal + pwsh
    不搞花里胡哨的.
    ysc3839
        7
    ysc3839   2020-11-28 01:31:38 +08:00 via Android
    @codehz 我没有详细测试过,不方便评价。
    但是按理来说 cygwin 不应该还没解决这个问题。
    LokiSharp
        8
    LokiSharp   2020-11-28 01:57:22 +08:00 via iPhone
    pwsh 足够了,我对现代 Shell 的期望是
    1 跨平台
    2 提供 IDE 、编辑器插件实现代码提示,错误检查
    3 可扩展,Shell 自身别整花里胡哨的特性
    Sparetire
        9
    Sparetire   2020-11-28 06:40:29 +08:00 via Android
    目前 windows terminal+git bash/power shell 还蛮舒服的,虽然 git bash 说的也是事实,但是路径转换问题我也只遇到一次,总的来说问题不大但能换回较好体验
    这个总感觉有那么点尴尬。。在痛点的地方没那么能打,能打的地方不是我的痛点。。可能还是看个人习惯吧
    37Y37
        10
    37Y37   2020-11-28 08:32:52 +08:00
    windows terminal 挺香的
    exip
        11
    exip   2020-11-28 08:52:55 +08:00 via Android
    Cmder 还行,再加上这个 yori 就更完美了
    codehz
        12
    codehz   2020-11-28 09:08:17 +08:00 via Android
    @ysc3839 cygwin/mingw 确实没解决,你可以试试新建一个超过 300 字符的文件,直接报错 File name too long
    lepig
        13
    lepig   2020-11-28 11:35:50 +08:00
    babun
    muzuiget
        14
    muzuiget   2020-11-28 13:22:29 +08:00
    我就要么 cmd.exe ,要么 bash,兼容性、稳定性和依赖是大问题,那一点点特性无所谓了。
    Kasumi20
        15
    Kasumi20   2020-11-29 01:05:30 +08:00
    终止批处理操作吗(Y/N)?

    哈哈, 戳中笑点
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1094 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:55 · PVG 04:55 · LAX 12:55 · JFK 15:55
    ♥ Do have faith in what you're doing.