证明新的Unix shell是合理的四个特性

2020-10-24 07:30:25

在一篇关于茴香语言基本原理的lobste.rs帖子中,我发布了关于石油为什么存在的摘要:

但是Oil有更多的东西,包括统一单独的广告表达语言……。

这篇文章详细阐述了这些观点。我已经将其基本原理浓缩为职业安全卫生语言的四个关键特征。

我给出了每个功能的示例,链接到文档(正在进行中),并对项目的未来进行了评论。

回想一下,OSH是为运行现有的shell脚本而设计的,并且从2018年初开始就这样做了。

它还用Opt-in特性修复了shell语言中的缺点。这是四个最重要的问题。

我刚刚完成了对壳牌公司易碎的Set-e/Errexit机制的大修。我对此很兴奋,因为我去年就开始了,但在被难住之后,我把它放在了次要位置!

我相信我现在已经解决了所有问题,并希望得到您的反馈。简单不变的是,OSH从不丢失退出代码,而POSIX shell或bash并非如此。以下是增强功能的摘要:

Strict_errexit-一个shell选项,用于检测在shell中丢失错误的情况,如如果myfunc。这改进了您的shell脚本,即使您在另一个shell下运行它们!换句话说,OSH可以用作开发工具。

Inherit_errexit-OSH实现此bash4.4选项,这是对";命令suberrexit";问题的部分修复。

COMMAND_SUB_ERREXIT-在每个命令SUB的末尾检查故障的shell选项,这样您就不会丢失错误。这解决了朱莉娅·埃文斯(Julia Evans)最近一部漫画的最后一个面板中显示的问题:猛烈抨击有时是奇怪的";

PROCESS_SUB_FAIL-类管道失败,但用于进程替换。意大利将errexit设置为";参见";进程SUB导致的故障,如cat foo.txt<;中的sortinvocation(SORT/OOOPS/ERROR),@_PROCESS_SUB_STATUS:类似于${PIPESTATUS[@]}的变量。您可能需要检查所有进程的退出状态。

Run内置打开errexit,所以如果运行myfunc是安全的。它还提供对退出代码的细粒度控制。

是的,有很多解决方案,因为shell有很多问题!但是你不必记住所有这些名字。将SHOT--设置油:BASIC添加到您的程序的顶部,以打开所有选项。Strict_errexit失败将提醒您使用运行包装器。

(旁白:我能够在解释器中干净利落地解决所有这些问题。4年前,我花了很多时间在石油公司的架构上,这样我就可以解决这些微妙的问题。当代码具有良好的结构时,修复的正确位置就会自动展现给您。(油价仍在改善!)。

QSN是实现石油领域结构化数据的基础。每当您需要在shell中处理用户提供的数据时,它就不再需要发明特殊的(通常是不完整的)格式。换句话说,除了混乱的解析和拆分之外,Oil脚本还有另一种选择。

这里有一些简短的例子。写内建函数将其参数输出到stdout,并接受--qsn标志:

#打印文件名为每行一个。如果名称包含#换行符或其他特殊字符,则它的QSN编码类似于\n带有NUL\0字节的多行名称--qsn--*.txt。

Cat list.txt|While read--line--qsn{#_line由';read';rm--$_line}隐式设置。

我还实现了read-0作为bash-r-d;';模糊的read-r-d;';的同义词,这允许您像xargs-0一样在shell中使用find-Print0输出。此格式与QSN不同,但现在很容易在它们之间来回转换。

这是第一次削减QSN支持。我希望它会根据您的反馈而发展!

这是在2019年夏天完成的。我在今年早些时候的“简单单词评估”中对此进行了描述,您可以在Oil语言习语中看到示例。

这篇博客始于2016年,对静态解析进行了解释。我在介绍中引用的评论中没有提到这一点,但它仍然是该项目的关键部分。

当我注意到二三十年前Perl5和RCshell的作者都抱怨shell的动态解析时,我意识到这是多么重要!

这个基金会仍在支付红利。我最近使用静态解析器为命令subs创建了详细的错误消息:

$SHORT--set errexit command_sub_errexit$d=$(日期%x)日期:无效日期‘%x’d=$(日期%x)^~[交互]:13:FATAL:命令SUB已退出,状态为1...。

$SHORT--set PROCESS_SUB_FAIL$cat/dev/null<;(排序oops)排序:无法读取:oops:没有这样的文件或目录cat/dev/null<;(排序oops)^~[交互]:27:FATAL:正在退出,状态为2...。

此外,Travis Everett还开发了一个依赖于静态解析的shell依赖捆绑器。

明确地写出这种语言的基本原理确实很有用。我用#为什么是新贝壳#的帖子多次重复这一点,但即使在4年后再次解释也是有帮助的。这个项目正在发展,并且变得越来越清晰。

随着Errexit和QSN解码器的大修,我相信我们现在已经具备了OSH语言的所有基础!这些功能将在下一版本中删除。

有人声称,仅这四个特性就证明了一个新的Unix shell是合理的。如果我们完成C++翻译,并在这里结束项目,这将是值得的。

消除引述地狱的话。让我们一劳永逸地解决它,而不是在接下来的30年里告诫每一个新的shell程序员,因为过去的30年里已经这样做了!

如果你不同意,请告诉我!我想知道shell语言中还有哪些地方需要修复或以其他方式解决。

(我在这里省略了交互式shell,因为我认为当务之急是开发一个更好的编程和自动化shell。A";Cloud Shell";如果你愿意,也可以这么说。)。

早在一月份,我就已经担心这个项目的范围了。我写道,该项目最大的削减将是Oil将基于字符串,而不是类似Python的数据类型。

OSH语言是基于字符串(和字符串数组)的兼容shell。赋值看起来像是本地x=mystr。

Oil语言有类似Python的类型和表达式,赋值看起来像var x=42+a[i]+f(x,y)。它具有容量收集的递归数据结构堆。

因此,我现在要说的是,今后的首要任务是完善职业安全与健康语言,而把石油语言推迟到朦胧的未来。

这意味着完成到C++的转换,连接垃圾收集器,并编写文档。这可能意味着准备将代码嵌入到另一个应用程序中,比如鱼壳。(我已经和维护员讨论过这个问题,大家都很感兴趣。但这是一项繁重的工作,不应该想当然地认为这是理所当然的,而且还有很多问题没有解决。)。

实现这一OSH语言里程碑感觉非常可行,因为一切都已经在Python中运行,C++的1685个规范测试空间中有915个(产生30倍-50倍的加速比)。

但是我不会放弃石油语言!我只是需要帮助。它以原型的形式存在,您的反馈将激励我继续工作。

油画语言的四大特点。这个帖子将职业安全与健康缩小到四个主要功能,而Oil也有四个:

序列化格式,如JSON和QTSV(建议)。后者是一种用于类型化表格的格式,建立在QSN之上。

石油语言的巨大变化。列出了我最近所做的更改,这些更改应该会让潜在的贡献者对这门语言有一个感觉。

Python、JS和Ruby与Perl和PHP的不同之处。前面的语言有一个干净的数据模型/内存模型:带有引用语义的垃圾收集堆。

漫画评论。我可以用这些最近的漫画作为解释职业安全卫生语言的一种方式。(参见其他标记为#COMIC的帖子。)。

我描述了改进的shell语言的4个基本特性。让我知道你认为遗漏了什么。

如果您还没有读过,请参阅为什么创建UnixShell?它是这个网站上最受欢迎的页面,不过我仍然需要在2021年更新它。

然后我提议把重点放在让职业安全卫生语言准备好生产上。我还在学习石油语言,但我需要帮助完成它。

谈到这一点,有几个人指出,石油的开发过程是困难的。我最近已经解决了这个问题,从构建日志中删除了spew,并使用/usr/bin/env为更便携的Shebangs添加了一个线条检查(这刚刚触发并防止了回归!)。

我仍然想制作一个截屏视频来展示Oil是多么容易工作。在克隆之后,10或20秒的构建过程应该会为您提供一个可工作的bin/Osh:

因此,我正在努力让“石油”变得更好用。(工业和信息化部电子科学技术情报研究所陈皓)。如果你想帮忙,如果你遇到问题,请伸出援助之手。

感谢Till Schröder对石油语言的巨大反馈。例如,他注意到我给catchbuiltin(现在是Run)起了个笨拙的名字。

感谢迭戈·卡莱贾多次更新石油文档。这本身就是一个巨大的努力!

这4个功能并不是OSH中唯一的功能,但我认为它们已经足够了!

我用shell修复了其他问题,并用标签为#Real-Problems的帖子来描述它们。我把这个标签贴到了这篇帖子上,因为COMMAND_SUB_ERREXIT解决了朱莉娅·埃文斯(Julia Evans)困惑的问题。

我相信Oil会在3个维度上比bash更快:解析速度、运行时计算速度和运行时I/O速度。然而,这可能需要在完成垃圾收集器后进行优化,而我们缺少人手来做到这一点。

我希望Oil有更好的开发工具:跟踪、调试和崩溃转储。几年前我制作了一个崩溃转储的原型,但没有收到太多反馈。我认为,职业安全与健康必须更加成熟,才能令人信服。

分口译员(问题704)有多个用例。在CPython中添加这个特性的尝试已经失败了很多次,而像Tcl和Lua这样的嵌入式语言很好地利用了它们。

我甚至认为在Oil中嵌入WebAssembly有很好的用例,比如7月份关于常规语言的文章中提到的,另一个用例是打包和分发可移植的开发依赖项,比如CommonMark渲染器。这个问题导致了上面提到的开发过程摩擦。