Skip to main content

dash shell 作为库的绑定

项目描述

主要工作流程

libdash是 Linux 内核dashshell 的一个分支,它构建了一个带有额外暴露接口的可链接库。libdash 的主要用途是解析 shell 脚本,但它可以用于更多用途。

Python 绑定被打包为libdashPyPi 包

OCaml 绑定 --- 打包为libdashOPAM 包--- 包括两个可执行文件shell_to_jsonjson_to_shell,这让您可以方便地将 POSIX shell 脚本解析为 JSON AST。

有什么依赖关系?

dash 的 C 代码应该建立在各种各样的系统上;它需要libtoolautotools( aclocal, autoheader, automake, autoconf)。该库可能无法在具有深奥链接器的平台上构建;它已经在 macOS 和 Linux 上进行了测试。

Python 和 OCaml 绑定依赖于能够构建 C 代码。有关libdash.opamOCaml 代码依赖项的详细信息,请参阅,其中包括构建时外部依赖项。Python 轮子不需要这些构建时依赖项,但从 Python 源代码分发构建只有在存在libtool时才会成功。autotools

CI 脚本(在 中.github/workflows/build.yml)提供了构建细节。

如何libdash从源代码构建

Python

运行python3 setup.py install。在 macOS 上,您必须首先通过brew install libtool autoconf automake.

您可以通过运行测试 Python 绑定:

cd python; make test

OCaml

安装 OPAM 文件:opam pin add .opam install .. 这将构建 OCaml 库并将其安装在您的 OPAM 存储库中。另一个目录中有测试;它们只会在实际安装 libdash 时构建。

您可以通过运行以下命令来测试 OCaml 绑定:

cd ocaml; make test

测试

测试用于test/round_trip.sh确保test/tests通过解析和漂亮打印正确地往返中的每个测试器文件。

此外,您可以运行比较 OCaml 和 Python 实现的测试(在您安装它们之后):

cd test; make

如何使用解析器

对于 Python,请参阅python/rt.py执行往返的示例工具:从 shell 语法到 AST 再到 shell 语法。

对于 OCaml,请参阅ocaml/shell_to_json.ml解析 shell 语法并生成 JSON(使用atdgen绑定)的工具。

使用的理想低级接口parsecmd_safeparser.c; 您需要确保已调用 dash 的初始化例程并且正确管理堆栈标记。解析 POSIX shell 是一件复杂的事情:除了通常的语言环境问题,别名会影响词法分析器,因此必须使用setaliasunalias管理任何应该存在的别名。

如何使用已解析的节点

通用 AST 在 中描述nodes.h。控制代码的精确格式存在一些棘手的不变量;OCaml 代码显示了使用 中的args字段的一些示例ocaml/ast.ml,它将 C AST 转换为 OCaml AST。

OCaml 工具将生成 JSON AST shell_to_jsonjson_to_shell允许您以任何语言使用这些 AST。

漂亮的印刷

漂亮的打印机尽最大努力生成有效的 shell 脚本,但可以手动构建不直接对应于有效脚本的 AST 节点。

例如,Python AST[[['Q', [['C', 34]]]]]表示包含双引号字符的带引号的字段。从字面上翻译,这将产生 string """,这不是一个有效的 shell 脚本。漂亮的打印机将自动转义内部引号, render "\""

当打印机试图以任何一种方式正确处理时,您应该使用转义来向打印机发出何时转义的信号:您应该使用 Python AST[[['Q', [['E', 34]]]]]将内部双引号标记为转义。

已知的问题

我们目前不转义字符!(感叹号)。在交互式 shell 中,!可能被视为历史替换(因此应该被转义),但在非交互式 shell 中,!被正常处理。我们目前迎合非交互式外壳;最终这种行为将是可控的。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

libdash-0.3.1.tar.gz (171.0 kB 查看哈希

已上传 source

内置发行版

libdash-0.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 pp39

libdash-0.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 pp38

libdash-0.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 pp37

libdash-0.3.1-cp310-cp310-musllinux_1_1_x86_64.whl (250.3 kB 查看哈希

已上传 cp310

libdash-0.3.1-cp310-cp310-musllinux_1_1_i686.whl (244.7 kB 查看哈希

已上传 cp310

libdash-0.3.1-cp310-cp310-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 cp310

libdash-0.3.1-cp39-cp39-musllinux_1_1_x86_64.whl (250.3 kB 查看哈希

已上传 cp39

libdash-0.3.1-cp39-cp39-musllinux_1_1_i686.whl (244.7 kB 查看哈希

已上传 cp39

libdash-0.3.1-cp39-cp39-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 cp39

libdash-0.3.1-cp38-cp38-musllinux_1_1_x86_64.whl (250.3 kB 查看哈希

已上传 cp38

libdash-0.3.1-cp38-cp38-musllinux_1_1_i686.whl (244.7 kB 查看哈希

已上传 cp38

libdash-0.3.1-cp38-cp38-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 cp38

libdash-0.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl (250.3 kB 查看哈希

已上传 cp37

libdash-0.3.1-cp37-cp37m-musllinux_1_1_i686.whl (244.7 kB 查看哈希

已上传 cp37

libdash-0.3.1-cp37-cp37m-macosx_10_9_x86_64.whl (156.6 kB 查看哈希

已上传 cp37