具有对JSON,YAML,TOML,CSV等的本机支持的替代Shell。

2021-02-27 22:49:04

murex是一个shell,例如bash / zsh / fish /等。它遵循与POSIX shell(例如Bash)类似的语法,但是支持的高级功能比您通常期望的$ SHELL更高级。

它的目的是与传统弹药足够相似,以保留大部分的肌肉记忆,同时又不怕在< bash-isms"处做出重大改变。导致无法阅读,难以维护或不安全的代码。

murex是为提高DevOps生产力而设计的,因此它不适合您通常在Bash中运行的高性能工作负载(例如,作为并行进程分叉的管道)。

更智能地处理错误(例如,try / catch块,错误消息中包含的行号,可选的以红色突出显示的错误等)

支持类型化管道-可用于本地处理复杂数据格式(如JSON)。而且还具有完全覆盖甚至忽略类型化数据的功能,因此它也可以与标准UNIX工具一起透明地工作

另外,shell的每个方面都易于扩展,检查并可以通过murex自己的软件包管理器进行管理

该语言采用相对简单的语法,该语法宽松地基于功能和基于堆栈的编程范例(尽管没有LISP样式的嵌​​套圆括号,这使很多开发人员感到恐惧),同时尽可能地保持与POSIX之类的shell(例如Bash)的兼容性。例如,一个程序结构可能如下所示:

但是,murex的不同之处在于,尽管管道令牌|支持与现有Shell的兼容性,Murex习惯用法更喜欢->用于可读性,因为它清楚地说明了数据流的方向。例如

该语言本机支持多种数据类型。例如JSON,YAML,CSV,S-Expression甚至是松散制表的终端输出(例如ps,ls -l)。与处理像Bash这样的传统shell中的简单字节流相比,处理更复杂的数据安排时,这使通过管道传递数据和解析输出更加容易。

除了murex精心设计并考虑脚本编写之外,交互式shell本身也围绕生产力而构建。为此,我们编写了自己的readline库。下面是该库的使用示例:

语法突出显示(尽管示例中没有太多语法要突出显示)。如果您希望禁用颜色,也可以将其关闭

列表视图中的制表符完成(在选择进程名称以杀死在选择时替换了进程ID的位置时可见)

regex搜索制表符完成建议(在cd和kill中都可见-通过按[CTRL + f]启用)

使用$ EDITOR进行行编辑(示例中的vi-通过按[ESC],然后按[v]启用)

在将多行数据粘贴到缓冲区中之前,先读取readline的警告,然后将预览选项作为上述警告的一部分使用

尽管添加到shell的功能很多,我们仍尝试将" magic"的数量保持不变。最小化并遵循相当标准的结构,因此语言是可预测的。但是,有些时候魔术会走很长一段路。例如,在管道中管理了murex对不同格式的复杂数据对象的支持,因此在从它们查询数据时,您无需考虑数据格式。

打开:file.csv-> [column_name]#返回CSV fileopen中的特定列(或行):file.json-> [index]#返回JSON中的特定项目

索引函数([]根据管道数据类型更改其匹配算法,而open根据文件扩展名或MIME类型设置数据类型。

有时,您会需要更少的猜测,或者只是想要强迫行为的鲁棒性。在这些情况下,您可以通过广播数据类型来删除魔术层:

打开:file.txt->转换csv-> [column_name] open:file.txt->转换json-> [ 指数 ]

对数据结构的这种认识还可以在foreach(它将循环遍历数组中的每个索引)和formap(针对复杂对象的键/值迭代)中得到利用。有关这些和其他控制结构的更多详细信息,请参见GUIDE.control-structures。

尽管Bash具有全部功能,但到处都是隐藏的陷阱。 murex的目的是要尽可能多地解决这些问题,而又不会失去交互式命令行的灵活性或强大能力。这可以通过几个关键概念来实现:

与常规shell相比,最大的突破性变化是默认情况下shell无法扩展globing。相反,这是通过将函数内联为数组来完成的:

murex方法的优点是我们现在可以提供遵循相同惯用模式的其他匹配文件系统对象的方法:

#通过regexp patternls -l @ {rx \ .go $}匹配文件#仅匹配directoryls -l @ {f + d}

但是,有时您只需要内联扩展(例如,使用交互式shell时),可以通过@gcommand前缀实现:

从可用性的角度以及定义完成规则的角度来看,Murex在命令行自动完成方面采用了稍有不同的方法。

受IDE的启发,murex直接在手册页中查询标志以及&tools&tooltip"。说明。通过JSON定义自定义补全,这意味着更容易定义简单的命令,而复杂的命令仍可以像使用其他shell一样回退到使用动态shell代码。

这使得编写完成规则以及使代码更具可读性变得更加容易。 gits自动完成定义的示例:

private git-branch {#返回git分支,并从列表中删除当前分支。 [:0]-> !match *}自动完成集git {[{#定义顶级标志" Flags&#34 ;: [" clone&#34 ;、" init&#34 ;、" add&# 34;," mv"," reset"," rm"," bisect"," grep",&# 34; log","状态,","分支","结帐","提交&#34 ;," diff&#34 ;、" merge&#34 ;、" rebase&#34 ;、" tag&#34 ;、" fetch&#34 ;、&#34 ; pull",push",stash" ],#指定这些标志支持的值" FlagValues&#34 ;: {" init&#34 ;: [{" Flags&#34 ;: ["-bare" ]}]," add&#34 ;: [{" IncFiles&#34 ;: true," AllowMultiple&#34 ;: true}]," mv&#34 ;: [{ " IncFiles&#34 ;: true}]," rm&#34 ;: [{" IncFiles&#34 ;: true," AllowMultiple&#34 ;: true}],&# 34; checkout&#34 ;: [{" Dynamic&#34 ;:({git-branch})," Flags&#34 ;: [" -b" ]}]," merge&#34 ;: [{" Dynamic&#34 ;:({git-branch})}]}}]}}

murex还支持几种不同样式的完成建议。以适应不同的情况(上面的演示),以及内置的支持功能,可快速轻松地跳转到嵌套目录中的文件:

像传统的shell一样,murex在默认情况下也带有错误,并带有使它们静音的选项。但是,对于需要以有用的方式捕获错误的情况,murex也支持更清晰的决策结构:

#比较两个字符串如果{=`foo` ==`bar`}然后{out:"`foo`匹配`bar`"}#检查命令是否成功运行!如果{foobar}然后{err: "`foobar`不能运行"}

与传统的shell不同,murex的设计是将测试和调试模式嵌入到shell语言中。这意味着您可以针对shell脚本编写测试,作为shell脚本本身的一部分。

函数:hello-world {测试:定义示例{" StdoutRegex&#34 ;:(^ Hello World $)}出来:< test_example> " Hello Earth"}测试:运行{hello-world}

Hello Earth状态定义功能行Col. Message [FAILED]示例输出5 9 stdout:regexp与“ Hello Earth'不匹配”。

如果未启用测试模式,则将跳过任何测试命令而不执行它们,因此您可以在整个函数中自由地包含测试用例,而不必担心会对性能产生影响。

测试:单元函数别名{" PreBlock" :( {别名ALIAS_UNIT_TEST = example param1 param2 param3})," StdoutRegex&#34 ;:"([-_0-9a-zA-Z ] + =>。*?\ n)+&#34 ;," StdoutType&#34 ;:" str&#34 ;," PostBlock&#34 ;:({!alias ALIAS_UNIT_TEST} )}功能:别名{#以人类可读的格式运行时输出别名:--aliases-> formap:名称别名{$ name-> sprintf:"%10s => $ {esccli @alias} \ n" }->强制转换:str} test:运行别名

状态定义功能行Col. Message [PASSED](单位)别名13 1满足所有测试条件

首先建议使用GUIDE.syntax,因为它会概述Shell脚本语言的语法和数据类型。

GUIDE.type-system描述了murex的类型系统。大多数情况下,由于外壳是围绕生产力设计的,因此您无需担心在murex中键入内容。

或者,如果您已经是经验丰富的Bash开发人员,则可以阅读快速入门指南GUIDE.quick-start,直接使用murex。

您可以通过多种方式将murex加载到系统上。 有关详细信息,请参见安装。 murex大量使用测试和CI / CD,以确保最新版本可以安全使用。 Git预提交和预推送文件的存在是为了帮助开发人员在碰到功能分支之前就发现任何回归错误。 每一次git push都针对数百种不同的测试和种族检测器(在Circle CI中运行)进行了验证。 这些测试运行10次,以消除任何可能的与计时相关的错误。 每次进行开发和掌握的工作都会创建一个新的docker容器lmorg / murex:develop和lmorg / murex:latest(用于master分支)。 然后针对最新容器运行每周自动构建。 这些构建在AWS CodeBuild中运行,它们生成murex.rockswebsite并构建预编译的二进制文件以供下载。