V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  adoyle  ›  全部回复第 5 页 / 共 16 页
回复总数  317
1  2  3  4  5  6  7  8  9  10 ... 16  
已买,感觉还不错,支持一下
2019-07-09 21:59:00 +08:00
回复了 Tomorr 创建的主题 Blogger 收集一波个人博客
2019-07-03 13:45:18 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@iyaozhen 好的,根据上面的说法,我觉得应该可以在少部分模块不可用的情况下支持到 4.0+,Bash 3 就饶了我吧,不想蹚这浑水。
2019-07-03 11:04:48 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@ChristopherWu 题外话,可能你需要这个工具 https://github.com/koalaman/shellcheck
2019-07-03 09:20:19 +08:00
回复了 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,我想应该不会有更低的线上版本了。
2019-07-03 09:09:48 +08:00
回复了 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 就会不折腾么?每种方案都会伴随自身的局限,是否折腾要结合你的具体上下文来看。怎么避免就要靠你的聪明才智了。
2019-07-03 09:04:21 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@james122333 酷!利用 trap 真是巧妙的点子,感觉很有启发,可以改进 Lobash。感谢分享
2019-07-02 20:41:50 +08:00
回复了 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 方式不符合我的需求。
2019-07-02 19:34:10 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
2019-07-02 19:30:56 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
2019-07-02 19:26:33 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@james122333 没看懂这个 return 函数有什么用。这是为了解决什么问题?

我是为了让 return 0/1 只用来区分命令是否有异常,用 true/false 来区分命令返回值的真与否,并且配合 `set -o errexit` 和 `shopt -s inherit_errexit` 这样的先决条件,才这样写的 is_ 函数的。
2019-07-02 13:20:20 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@xuboying 你说的很对。果然这个库可能就是个玩具了
2019-07-02 11:53:47 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@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。
2019-07-02 11:26:25 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@rrfeng 恩,程序员嘛,就喜欢瞎折腾
2019-07-02 11:12:29 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@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 格式统一我先选择了严谨的写法,严谨虽然麻烦但总不会出错。你的意见我需要一点时间再考虑,如果确实没问题,可以新增一批模块,提供更多方便的选择。
2019-07-02 10:35:59 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@hgjian 不好意思,以后也不会加中文文档的,英语差可以翻字典一个个词来看,我也是从英语渣渐渐成长的,相信你也可以做到。
2019-07-02 10:29:34 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@0x11901 请仔细看 README,https://github.com/adoyle-h/lobash#module-usages
这里有用法,描述,例子,单测的链接,晚上有空我再加个跳到源代码的链接。
2019-07-02 10:28:14 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
刚刚打错字了,理想判断 => 理性判断
2019-07-02 10:27:20 +08:00
回复了 adoyle 创建的主题 Linux 分享一个 Bash 脚本编程类库 Lobash
@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
2019-07-01 12:43:36 +08:00
回复了 iihho 创建的主题 反馈 有时收不到提醒
请问怎么查看是否被降权?
1  2  3  4  5  6  7  8  9  10 ... 16  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5655 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 19ms · UTC 01:41 · PVG 09:41 · LAX 17:41 · JFK 20:41
Developed with CodeLauncher
♥ Do have faith in what you're doing.