分享一个 Bash 脚本编程类库 Lobash

2019-07-02 09:35:00 +08:00
 adoyle

https://github.com/adoyle-h/lobash

看名字你或许猜到了,这是一个受到 JS 的 Lodash 启发的,专用于 Bash 编程的类库。

Bash 脚本的坑很多,我期望能写一个类库,把复杂的东西封装到简单的函数(模块)里,一个函数只做一件事情。以此来增强开发体验。

我已经写了 90 个模块,近 500 个单测,大致 API 和开发模式已经稳定。

我曾尝试想将 Lobash 支持 Zsh 的,搭完测试框架和环境,跑了一下测试发现,Zsh 和 Bash 还有很多不一样的地方。所以决定放弃支持 Zsh,可能哪天我会再写个 Lozsh 库。

我在自己的 Dotfiles 里试吃了自己的狗粮,没有遇到什么问题。所以来试用一下吧,有什么感想提 Issue 或在这个帖子里留言即可。提 Issue 请尽量用英文,用中文也可以。

如果觉得有意思,欢迎与我一起共建。
如果觉得不错,请点一下 Star,让我有动力继续开发,谢谢。

8274 次点击
所在节点    Linux
60 条回复
adoyle
2019-07-02 11:26:25 +08:00
@rrfeng 恩,程序员嘛,就喜欢瞎折腾
hljjhb
2019-07-02 11:31:24 +08:00
bash 4.4+ 基本与服务器无缘了
iwtbauh
2019-07-02 11:35:36 +08:00
@pony279 #4

Linux 内核源码里面也有很多几百行的 shell 脚本。而且是 POSIX shell 脚本,连 bash 都不是。

如果你看一个发行版的源码树,你会发现很大的 shell 脚本多的是。

为什么他们要写这么长的 shell 脚本呢。原因在于需求决定了使用 shell 比其他语言更合适。源码树里还有大量的 perl 脚本和 c 代码,为什么这时候不用 shell,自然是因为解决相应的需求用另外的语言合适。而不是代码行数决定的。

“ 100 行以上不选 bash ”就像超过 100 米长的路不能骑单车一样可笑。
ps1aniuge
2019-07-02 11:45:11 +08:00
1 你用 bash 写 bash 库,我真的很佩服你。
2 我的观点:把 bash 扔到角落里,基本不用。99%用 powershell。
3 powershell win,linux 通用。
4 你的库对强类型支持如何?用你的库能实现布尔么?
powershell 有强类型。比如布尔,py 也有。还有 fish。
py 的主要问题是没有命令行管道。fish 的主要问题是它没有强类型库做底层支撑。

5 依赖。
5.1 啥也不装就啥功能都有。---无法实现。
5.2go 次好。但是 go 并没有提供命令行框架。也没有提供命令行。
5.3powershell 提供一揽子框架。安装简单。依赖比 py 好。没有绝对路径。
5.4py 没提供命令行,管道。安装有时需要编译。

结论:powershell 是最好的。

6tab 补全。
bash 一手好牌打烂了,还坑了 go。
用 go 开发的命令行程序,依赖 bash,依赖 bash 补全,那就要写补全脚本,
https://www.v2ex.com/t/563986#reply0

7 调试 shell 不行。
用 vscode+powershell,帮 shell 脚本实现单步,断点的例子
https://www.v2ex.com/t/575848#reply1

最终结论:
1bash 还有救么?
2 所有给 bash 续命的,都是幺蛾子,在 powershell 面前不值一提。命真续不了了。

3powershell 的主要优势
3.1win,linux 通用
3.2 后台硬(.net 库强)
3.3 常用库基本齐全。
3.4 有像 pypi 那样的官方,第三方存储库。一件安装任何扩展。有 n 大企业支持,给它发布模块。
3.5 有
命令行。
管道。
对象。管道前后传强类型对象。从 win 到 linux,用 ssh 远程传对象。
远程调试。
自动上传脚本到远程。

powershell 才是爱脚本人的未来,楼主既然这么强。何不编写 powershell 的脚本,放在 [powershell 画廊] 。帮助完善 powershell ?

powershell [强] [简] 死你!
adoyle
2019-07-02 11:53:47 +08:00
@hljjhb 诶,我也很纠结。`inherit_errexit` 选项 bash 4.4 才有,`Nameref` 4.3 才有,这两个我很难割舍。

`inherit_errexit` 保证程序按我理想的来,如果没有这个保证,就会有各种坑,具体看[这个链接]( https://mywiki.wooledge.org/BashFAQ/105),这对 bash 脚本开发者是个负担。

`Nameref` 主要是传递数组很方便。

bash 4.4+ 是基本与服务器无缘了,最多只能在 docker 里跑,但都能跑 docker 了,环境依赖问题就没有了,想用什么语言都行何必用 bash。
ps1aniuge
2019-07-02 12:06:23 +08:00
一个老烂番茄,你去顶,将会顶出一头臭汁。你应该去踩 2 脚。

powershell 不是开源的? 不是免费的?

问:powershell 啥时候开源(+免费)的?
答:
2015 年小范围内部开源,2016 年开发者大会上,正式法律开源。



问:开源后的 powershell,属于谁的财产?
答:
在遵守其开源协议的前提下。powershell 开源后。属于 [社区财产] 或 [任何人财产] 。



问:谁是 powershell 开源免费的最大受益者?
答:
powershell 可以运行在,win,mac,ubuntu1404+,centos7,debian8+,suse12+,arch,alpine linux,树莓派 Raspbian,win10-iot,docker,snap-app,open-wrt 路由器等。
这些系统使用者,是 powershell 开源免费的最大受益者。



问:powershell 完全开源了么?
答:
不完全是。
1 powershell 之所以简单、强大、好用。靠的是 powershell5.1+win 自带的 powershell 库。我们应该主要使用这些库。
这些库,并没有开源。开源之前,是否免费我也不清楚。
2 powershell6,powershell7,和相关的库,开源了。
这里面的区别主要是 [win 自带软件,相关的 powershell 库] 。
库数量很多,如 iis 的 ps 库。但这些 win 独有软件的 ps 库,跨不了平台。即便开源给 linux 也并没啥用。
另外一些 win,linux 通用的 ps 库,比如 sqlserver 的 powershell 库,已经开源免费放在了 github 和 powershell 画廊。

结论:
1 开源时间太短,社区力量不强。ps 开源库还没成气候。
2win 中的老旧不开源 ps 库挺好用。这些库中有价值的正在逐渐开源+跨平台。
3 不开源的 ps 库,如 iis 的 ps 库,hyperv 的 ps 库,还将继续存在,并作为 win 功能的一部分。


问:powershell 命令为啥那么长?我很不爽啊。
问:powershell 命令会重名吗?
答:
powershell 命令太多,超过好几万。微软为了 powershell 命令不重名,所以把 powershell 命令搞的很长。
正因为命令长,命令唯一,才让 ps 基本不需要像 python 那样,在脚本中 import 这个库、那个包。也没有 py 那种 [库或依赖] 路径问题。
鱼与熊掌而已。唯一的长命令名,不需要学习记忆包名。
实际上 linux 命令也很长。有很多子命令。比如:
kubectl expose deployment nginx --type=NodePort --name=example-service
git reflog expire --expire=now --all
也有人说:“像 java 和 php 这种包名或者 namespace 又臭又长的”
实际上库多了,包名字都会长。

bash 不需要安装么?
bash 是自带不需要装,但啥也干不了啊。你照样要东装一个包,西装一个包依赖软件。如:
linux 上的 expect 这个工具,也需要装 tcl !
impl
2019-07-02 12:21:24 +08:00
shell 不够,python 来凑
q397064399
2019-07-02 12:24:25 +08:00
@impl #26 为啥不直接用 Python 可能我觉得脚本语法太古怪了 而且没找到好的调试工具
Imr
2019-07-02 12:27:45 +08:00
想法不错,支持一下。

虽然就像前面那位说的熟悉 bash 的人肯定不会用到这些,但是把脚本语言正正经经写出来,挺有趣的不是吗
Meltdown
2019-07-02 12:40:05 +08:00
有了这种库的帮助,100 行 bash 就可以做更多的事情了。当然如果为了性能着想,我会考虑换成其他语言。
xuboying
2019-07-02 12:56:33 +08:00
楼主的想法不错,不过当今 bash 确实不适合做复杂的事情了。
1. 现在流行的容器化封装 init 程序直接启动 app,绕过 shell 了包括 bash
2. 运维也可以用 ansible,复杂的任务可以交给 python
3. bash 的可靠性也不太行,set -eu -o pipefail 异常捕获在自己的 term 下执行 OK,上了 ci 系统就失效了。一直搞不清哪里出问题。有空还得换成别的更可靠的语言
sinopec
2019-07-02 13:00:53 +08:00
@pony279 确实 复杂点的 我为什么不用 python
pony279
2019-07-02 13:03:52 +08:00
@iwtbauh 100 行只是我随便提的数字,旨在说明复杂的逻辑不适合用 shell 完成,你杠这个数字的意义是什么?
ps1aniuge
2019-07-02 13:10:18 +08:00
大渣豪,我系渣渣辉,
我会写一篇为什么不用 shell 脚本人,为啥要用 powershell,而不用 python。敬请期待。
adoyle
2019-07-02 13:20:20 +08:00
@xuboying 你说的很对。果然这个库可能就是个玩具了
playnoa
2019-07-02 13:27:53 +08:00
@ps1aniuge 这种名词+动词的方式其实很方便的,另外,教主,带我走~~
leopku
2019-07-02 14:11:17 +08:00
@adoyle 先点个赞

不过在升级 bash 和安装 nodejs / java / golang 之间,我宁愿选择后者

再说如果依赖成为问题,我会选择用 c / golang/rust 写
Geeker
2019-07-02 15:48:37 +08:00
这个很强啊,平时写点小脚本还挺实用
BruceAuyeung
2019-07-02 15:56:32 +08:00
很久之前我就有想搞一个这样的工具库,可是实在懒没干成,所以特地 star 支持下
james122333
2019-07-02 16:02:43 +08:00
这库才刚开始开发...
不过我写的不会公开就是了
参照我之前回复的
https://www.v2ex.com/t/570005
还可以这样搞

readonly true=1
readonly false=0

return() {
case $1 in 0|true) echo true ; builtin return 0 ;; 1|false) echo false ; builtin return 1 ;; *) echo $1 ; builtin return $1 ;; esac
}

shell 可以处理复杂逻辑吗? 当然可以 至于好不好维护是看个人怎么写

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579173

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX