那个其实是从 fish 学的
感觉不错,周末试试,哈哈。
我突然想到某个大牛说过一句话:太阳底下没新鲜事。。。。
btop 迅速出现替代 bashtop,感觉已经足够说明改进版 bash 语言的尴尬境地。omz 也有受到 starship 等的侵袭。对于明确广泛的需求,怎么说服用户使用改进版 bash 而不是 rust、go 等原生语言,是个巨大的挑战。
粗略来看,elvish 还有 oilshell、nushell、powershell 等竞争对手呢。楼主可以写个对比,估计有许多人愿意看。
mark.
我也一直想用某种编程语言替代现在的bash, 试过common lisp和elisp, 但发现对我来说好像折腾来折腾去没有必要, 并不会提高很多的效率, 可能是我的需求太少了.
但如果真的要写复杂的脚本, 是不是直接上python这类胶水语言就行了?
蹲一下楼主进一步的科普
elvish 是改进版的 scheme,而不是 bash。有 lambda,词法作用域,numeric tower,持久化数据结构,try catch,gorountine。大部分用户都是因为不喜欢 bash 语言,才会有这种诉求。在竞品里面它是离 bash 区别最大的。
elvish 首先是一个能做到日常使用程度的交互 shell,在这基础上它有个对现代人接受度较高的编程语言。
大部分脚本语言都没有管道的抽象,组合外部程序很难受。更难以做为交互 shell 用。
eshell 勉强能用,主要问题是跑不了带 TUI 的程序,vterm 配置麻烦而且容易崩溃。
现在说 scheme 连 ((()))
都不用伪装一下吗
这有啥好装的,elvish 做算术: put (* (+ 12 8) (- 6 9))
,妥妥的 sexp
Thanks!
文章看了, 解决了我的疑惑.
在powershell里试了一下, 挺喜欢的!
但还不知道怎么整合到msys2里(不知道有没有什么坑)
粗看 oil 也是个功能齐备的编程语言,这个有对比吗?还有 vlang、ziglang 呢?
改进 shell 脚本语言,面向的是相对保守的一群用户,别的不说,老掉牙的 man 格式还在用呢。
在没有明确体验改善的情况下,为了语法不晦涩改进相当于对项目重构,难度比较大。更别说近年来一堆交互式的 CUI 程序迅速涌现。
另外多说一句,管道传 json 特性被看过重了。这个实际上是要解决对输入方数据校验的问题。这个特性的提出 – 对输入输出端进行标准化,当然是好的。但如果更进一步提供 c、c++、python 等的 json 库,让现有的程序只需要两行代码就可以完成 json 输出。感觉更好一些?
其实挺多人是从 tuna 镜像站知道这玩意的,那里直接开门见山地交代了这个 shell 的背景 Index of /elvish/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 也就是所谓国产
说实话,抛开语法,我觉得 yash 作为轻度的交互式 shell 挺不错的。兼容 posix,基于这个可以用很多写给 bash 或者部分 zsh 的程序,如 zoxide。而且,他有命令历史提示,类似于 zsh-users/…auto suggestion,tab 补全的提示也比较顺滑
看了眼知乎上贴的评论,elvish 也有提供 bash 的兼容层。说明作者对这个还是比较清醒的。
不过说到这个,我想起一件事。我在使用 zoxide 时,他为 elvish 生成的配置被 elvish 说是做法过时了,给我一种 elvish 非常激进的感觉
不对输入数据校验,说管道机制丑陋。迄今为止,没有任何程序敢说无论输入什么数据它都能处理。我还想让管道传二进制数据呢,还想让它处理断断续续的 stream 流呢。
唯一的解决方案就是标准化。但标准化和自由处理两者不可得兼。脱离应用场景说丑陋,哪有能医治所有疾病的万能良药。
dash取代的是年久失修的 sh,跟 bash不是竞争关系。
Linux 上 bash 作为默认交互 shell 的地位视线可及的范围内不会被动摇。
年久失修的 sh
指 bash 年久失修(,dash 出现之前 Linux 没几个 /bin/sh 不是 link 到 /bin/bash 的。
并没有实现,只是作者开个 issue 表示可能有计划,然后下面一堆用户和contributor表示不需要,于是 defer 了。
因为 1. elvish 还处于 0.1x 版本 2. 其实 zoxide 需要的配置抄下来也没几行,我直接抄下来改正语法后还精简了。3. zoxide 的设计反而说明了多数 shell 用戶根本读不懂也改不动那些 shell 配置,只会用现成的现象,我用上了 evlish 才两天就能改配置,反而说明了 elvish 相比其它 shell 有简单易学的特点。
比如,下面这段函数可以用 elvish 自带的 listing mode 来取代 fzf 启动 zi 命令。
# Jump to a directory using interactive search.
fn __zoxide_zi {|@rest|
var path
try {
fn item {|x| put [&to-show=$x &to-accept=$x &to-filter=$x] }
set path = [(zoxide query -l $@rest | each $item~)]
} catch e {
} else {
edit:listing:start-custom $path &accept=$builtin:cd~
}
}