首页   注册   登录
 adoyle 最近的时间轴更新

adoyle

V2EX 第 27765 号会员,加入于 2012-10-08 00:42:32 +08:00
大自然的搬运工
分享一个 Bash 脚本编程类库 Lobash
  •  3   
    Linux  •  adoyle  •  106 天前  •  最后回复来自 adoyle
    60
    请教 Shell 空字符串数组的问题
    Bash  •  adoyle  •  104 天前  •  最后回复来自 james122333
    9
    用 ANSI Escape Code 改变 Shell 文字样式
    Linux  •  adoyle  •  122 天前  •  最后回复来自 ggicci
    3
    统计一下,如果你在用 bash,用什么版本号的 bash?
    Bash  •  adoyle  •  129 天前  •  最后回复来自 adoyle
    7
    关于提问和分析问题的两篇文章
    分享发现  •  adoyle  •  140 天前  •  最后回复来自 adoyle
    1
    HTML5 标准,现在应该看 w3c 的还是 whatwg 的?
    HTML  •  adoyle  •  2017-03-27 20:48:32 PM  •  最后回复来自 adoyle
    2
    请问 Spinner 的中文翻译?
    翻译  •  adoyle  •  2017-01-19 11:06:30 AM  •  最后回复来自 morethansean
    2
    有谁知道 TLSG 是什么公司?关于短信验证的
    问与答  •  adoyle  •  2016-06-11 18:13:43 PM  •  最后回复来自 meteor
    2
    自己写了一个 /usr/local/bin/cd,但是每次调用还是 /usr/bin/cd
    Linux  •  adoyle  •  2015-10-17 21:57:23 PM  •  最后回复来自 Tink
    7
    adoyle 最近回复了
    已买,感觉还不错,支持一下
    100 天前
    回复了 Tomorr 创建的主题 Blogger 收集一波个人博客
    106 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    @iyaozhen 好的,根据上面的说法,我觉得应该可以在少部分模块不可用的情况下支持到 4.0+,Bash 3 就饶了我吧,不想蹚这浑水。
    106 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    @ChristopherWu 题外话,可能你需要这个工具 https://github.com/koalaman/shellcheck
    106 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    @xiaolanger @hljjhb

    想了一下,线上服务其实也能跑。Lobash 可以支持 4.2+。但数组相关的模块还有 sub/inc 模块一共 9 个模块无法使用,起码剩下 80+ 个模块是可以用的。

    具体分析如下:

    Lobash 依赖 4.4 的 inherit_errexit 特性和 4.3 的 nameref 特性。

    但在 4.4 出来之前,还是有很多用 Bash 写的脚本在线上跑也没出问题嘛。
    所以 inherit_errexit 这个开关可以是个可选项(原本就是开发者自己选择去开的),
    开启 inherit_errexit 是为了保证 fast-fail,
    如果没开它,那就由开发者自己负责保证不触发异常情况(这本就是开发者应做的),多测试各种边界,那还是能在 4.3 上跑的。于是 Lobash 就可以兼容到 Bash 4.3+。

    4.3 的 nameref 特性也不是所有模块都有用到,目前就数组相关的模块还有 sub/inc 模块一共 9 个模块有用到。
    判断模块是否有用 nameref 特性的方法很简单,只要调用方式是传递变量名的,都是用到了 nameref 特性。
    于是你只要使用剩下的模块,阉割了部分功能的 Lobash 就可以兼容 Bash 4.2+ 啦。
    不过还需要你改下生成的 lobash.bash 里的 check_supported_bash_version 函数,把版本号检查改到 4.2,默认是 4.4。

    我这线上 centos 都是 Bash 4.2,我想应该不会有更低的线上版本了。
    106 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    @huiyifyj

    > bash 这玩意写不动大一点的功能

    你见过用 bash 写的 docker 吗? https://github.com/p8952/bocker
    虽然是依赖了很多 linux 程序,15 年就停止更新了,但功能不算简单吧。
    还有 Lobash 中使用的测试框架 [bats-core]( https://github.com/bats-core/bats-core) 也是纯 bash 编写,功能挺复杂的。
    还有很多有意思的 shell 命令: https://github.com/alebcay/awesome-shell

    能写出什么东西,一部分取决于语言的表达力,一部分取决于你的想象力。

    > 这样折腾会写着就很累,除非支持模块化(像 powershell 那样)

    通过唯一的命名空间来做模块化,Lobash 就是这么做的,Bash 脚本一般依赖不多的,可以人为控制避免命名冲突,虽然糙了点但能用啊。
    然后,难道支持了模块化用了 powershell 就会不折腾么?每种方案都会伴随自身的局限,是否折腾要结合你的具体上下文来看。怎么避免就要靠你的聪明才智了。
    106 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    @james122333 酷!利用 trap 真是巧妙的点子,感觉很有启发,可以改进 Lobash。感谢分享
    107 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    @james122333 大致了解了,想法很有创意,但是不符合我的需求。你看这段代码
    https://gist.github.com/c52d778b9b01c183d0eb41aa16892177#file-t-bash

    期望的是 is_success 返回 false,foo 收到后把结果打印出来,但执行会发现在 33 行就跳出程序了。
    因为 `set -o errexit` 和 `shopt -s inherit_errexit` 起了作用。

    `shopt -s inherit_errexit` 的目的是为了快速失败 (fast-fail),当 sub-shell 里抛异常了,那么当前 shell 也应该停下来而不是继续执行下去。所以 inherit_errexit 这个选项是必须的。
    我为了区分异常控制流和普通的数据流,才因此用 return 0 表示命令正常,return 1 表示类似 throw error。用 echo true 表示数值为真,用 echo false 表示数值为假。
    因此你说的 return 方式不符合我的需求。
    107 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    107 天前
    回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2400 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 35ms · UTC 15:12 · PVG 23:12 · LAX 08:12 · JFK 11:12
    ♥ Do have faith in what you're doing.