分享一个 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,让我有动力继续开发,谢谢。

7663 次点击
所在节点    Linux
60 条回复
dandycheung
2019-07-02 09:51:55 +08:00
手动点赞,挺好。
Meltdown
2019-07-02 09:58:21 +08:00
不错,收藏
wutiantong
2019-07-02 10:00:43 +08:00
看起来不错
pony279
2019-07-02 10:08:49 +08:00
无意冒犯,还是忍不住泼点凉水,bash 虽然可以当编成语言用,但这怕不是 shell 脚本的初衷

100 行内还搞不定的事情,还坚持用 bash 就是糟糕的选择

写 bash 的人就应该熟悉语法,就是追求极简,用

l.is_file() {
[[ -f ${1:-} ]] && echo true || echo false
}

if [ $(l.is_file $filename) == "true" ] ; ... fi

这样罗嗦的方式来替代

if [ -f "$filename" ] ; then ... fi

是不明智的选择

如果有用各种基础库的需求,还不如重新设计一个语言,bash 干这个真的特别别扭
adoyle
2019-07-02 10:27:20 +08:00
@pony279

> 100 行内还搞不定的事情,还坚持用 bash 就是糟糕的选择

坚持还是不坚持,是用户的理想判断和选择自由,Lobash 只是为选择 Bash 提供一些帮助而已。100 行内搞不定的事情,确实可以考虑其他语言。但为什么要选择 bash 呢?我觉得在于依赖,比如你用 nodejs 写,运行你程序的用户需要在运行平台装 node,依赖的版本管理升级怎么办,这会引入更多问题。bash 和 linux 命令行大多数是通用的,虽然我这个库需要用 bash 4.4,而现实上 linux 装的大多数是 bash 4.3,但是升级一下 bash 还是很简单的事。


> 写 bash 的人就应该熟悉语法,就是追求极简
这是对于熟练工而言的,当你只是想用 bash 用管道去写个小程序,当你去翻 bash 手册熟悉语法越陷越深,就我的经验而看 bash 有是很多坑的,学习的过程是比较痛苦的。

is_ 系列为什么要这么啰嗦的返回 true 或者 false ?请看这个链接
https://github.com/adoyle-h/lobash/blob/develop/doc/how-to-write-functions.md#how-to-return-a-boolean-value
0x11901
2019-07-02 10:28:02 +08:00
没有 API 文档吗?不可能 90 个模块需要我自己看哪个能用上吧……

还有实名反对楼上的观点。
adoyle
2019-07-02 10:28:14 +08:00
刚刚打错字了,理想判断 => 理性判断
adoyle
2019-07-02 10:29:34 +08:00
@0x11901 请仔细看 README,https://github.com/adoyle-h/lobash#module-usages
这里有用法,描述,例子,单测的链接,晚上有空我再加个跳到源代码的链接。
hgjian
2019-07-02 10:33:39 +08:00
没有中文文档,看不懂哦,我英语差。
adoyle
2019-07-02 10:35:59 +08:00
@hgjian 不好意思,以后也不会加中文文档的,英语差可以翻字典一个个词来看,我也是从英语渣渐渐成长的,相信你也可以做到。
jorneyr
2019-07-02 10:38:04 +08:00
挺好的
YK46PTT
2019-07-02 10:40:01 +08:00
挺好的, 之前也想找这样的 repo
zhanglp888
2019-07-02 10:52:09 +08:00
赞,感动!
repo 现有的模块,已经能完成我基本所有的需求了
等我仔细看一下单测,再谈感想~
pony279
2019-07-02 10:54:31 +08:00
> 我觉得在于依赖,比如你用 nodejs 写,运行你程序的用户需要在运行平台装 node,依赖的版本管理升级怎么办,这会引入更多问题。bash 和 linux 命令行大多数是通用的,虽然我这个库需要用 bash 4.4,而现实上 linux 装的大多数是 bash 4.3,但是升级一下 bash 还是很简单的事。

1. 这取决于你的业务。如果本身没有什么依赖,能用 bash 写的,同样可以用兼容性好的 node 脚本完成。就是因为逻辑复杂了,才会不得不选择 node, java, go, python, php,才会有各种依赖和版本管理。

2. 升级 bash 4.4 就是修改你的系统工具了,至少需要 root 权限吧,有 root 权限安装个 node/php/python 也是一条命令的事情。

> is_ 系列为什么要这么啰嗦的返回 true 或者 false ?请看这个链接

> The way 2 cannot distinguish the false and the exception occurs in function (it will return other codes if your shell has set -o errexit and set -o pipefail). So the choice 1 is better.

return 0/1 / echo true/false 确实有这样的优缺点

长期做开发的人确实有严谨的逻辑

但是,从我多年写过的 bash 脚本来看,我根本不需要这些啊,如果按照你的考虑,每条都严谨处理,你的 l.is_file 会变成这样:

isFile=$(l.is_file $filename) # when exception with set -e, the script will abort immediately
if [ "$isFile" == "true" ]
then
...
fi

为了极度的严谨罗嗦正这样,何必呢。有这样的需求,正统的编成语言才是最优解。

再退一步想想,is_file 这种底层只依赖简单系统调用的东西都能异常,怕是整个操作系统即将崩溃了,就好比天塌下来了,为啥要关心桌子上的水杯还在晃。
dandycheung
2019-07-02 11:02:50 +08:00
@pony279 总会有一些我们每个人都想象不到的场景的,作者的努力让人有了更多的选择,世界也没有因此而更糟。我为什么需要呢,因为我有一块用一块淘汰了的 1GB 或者 2GB 的 TF 卡做系统盘的 Pi 板子,装个 Python 就有点嫌大,bash 刚刚好,就这样。
Karpov
2019-07-02 11:04:28 +08:00
对于 bash 场景有了很好的选择,谢谢分享
pony279
2019-07-02 11:10:03 +08:00
@dandycheung 我并没有打算否定作者的努力,我只是从我个人经验和实用性的角度解释这类工具的必要性。作者有他坚持的理由,我有不需要的理由,就是这么简单啊
adoyle
2019-07-02 11:12:29 +08:00
@pony279

> 2. 升级 bash 4.4 就是修改你的系统工具了,至少需要 root 权限吧,有 root 权限安装个 node/php/python 也是一条命令的事情。

全局安装了这些,多个不同的项目有相同依赖就会有版本冲突和不兼容的风险,所以我通常不推荐全局安装,用 nvm,rvm,gvm 来装各种语言环境。

在 Lobash 这个库我也考虑如果有多个类库来使用 Lobash,其他项目间接依赖多版本的 Lobash 怎么办。因此我使用 ./build + PREFIX + 时间戳 的方式来生成项目自己唯一的 lobash.bash。

用户选择什么方案,就要考虑这个方案的成本,具体细节具体分析吧。我只是为 Bash 增加使用的可能性,并不影响用户的判断,用户需要自己来判断自己需要什么。


> 为了极度的严谨罗嗦正这样,何必呢。有这样的需求,正统的编成语言才是最优解。

恩,你说的有道理。因为我急于开发出这套框架来应用,return 0 1 在我看来不理想,为了 API 格式统一我先选择了严谨的写法,严谨虽然麻烦但总不会出错。你的意见我需要一点时间再考虑,如果确实没问题,可以新增一批模块,提供更多方便的选择。
yidinghe
2019-07-02 11:14:30 +08:00
我是支持楼主的,我自己也写过简单的运维脚本 https://gitee.com/yidinghe/codes/394evuspjc1qfrwyzd2no37,只是用来启动和停止进程。另外我开启了 issue #2。
rrfeng
2019-07-02 11:23:22 +08:00
支持楼主的想法做法
但是实用性确实有限…

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

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

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

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

© 2021 V2EX