dash shell 作为库的绑定
项目描述
libdash是 Linux 内核dashshell 的一个分支,它构建了一个带有额外暴露接口的可链接库。libdash 的主要用途是解析 shell 脚本,但它可以用于更多用途。
Python 绑定被打包为libdashPyPi 包。
OCaml 绑定 --- 打包为libdashOPAM 包--- 包括两个可执行文件shell_to_json和json_to_shell,这让您可以方便地将 POSIX shell 脚本解析为 JSON AST。
有什么依赖关系?
dash 的 C 代码应该建立在各种各样的系统上;它需要libtool和autotools( 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_safe在parser.c; 您需要确保已调用 dash 的初始化例程并且正确管理堆栈标记。解析 POSIX shell 是一件复杂的事情:除了通常的语言环境问题,别名会影响词法分析器,因此必须使用setalias和unalias管理任何应该存在的别名。
如何使用已解析的节点
通用 AST 在 中描述nodes.h。控制代码的精确格式存在一些棘手的不变量;OCaml 代码显示了使用 中的args字段的一些示例ocaml/ast.ml,它将 C AST 转换为 OCaml AST。
OCaml 工具将生成 JSON AST shell_to_json,json_to_shell允许您以任何语言使用这些 AST。
漂亮的印刷
漂亮的打印机尽最大努力生成有效的 shell 脚本,但可以手动构建不直接对应于有效脚本的 AST 节点。
例如,Python AST[[['Q', [['C', 34]]]]]表示包含双引号字符的带引号的字段。从字面上翻译,这将产生 string """,这不是一个有效的 shell 脚本。漂亮的打印机将自动转义内部引号, render "\""。
当打印机试图以任何一种方式正确处理时,您应该使用转义来向打印机发出何时转义的信号:您应该使用 Python AST[[['Q', [['E', 34]]]]]将内部双引号标记为转义。
已知的问题
我们目前不转义字符!(感叹号)。在交互式 shell 中,!可能被视为历史替换(因此应该被转义),但在非交互式 shell 中,!被正常处理。我们目前迎合非交互式外壳;最终这种行为将是可控的。
项目详情
libdash -0.3.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 9d8b53ce4d0aa1346c6aff6c9e27f0221d1ff1bfb2bbfda37fa36645a1c353aa |
|
| MD5 | 0941a7894b6bb6d2a25fbc3860ff62a2 |
|
| 布莱克2-256 | 7412de866393e0cff79c2e87e260a842d143afa109c3ea059a3bdc7404412b23 |
libdash -0.3.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 6e7fc4465e7775f22a84dbf590ae66e214e05fc6ab96faeb8461eddd424f3fa6 |
|
| MD5 | b870571927f48042026258a047493ea8 |
|
| 布莱克2-256 | 8c6565c1fadf525a2110eb2ba87e6f42df34209d19c43220cb0ce3aa03fad168 |
libdash -0.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | d95bdc6d5ac3db020c3f6abc6dd8673e066da3338528caa07980bebfbb4587f5 |
|
| MD5 | 3b30692042a074fa7f0db58568ba343c |
|
| 布莱克2-256 | 21d0fb558e6d7599c0b18b9457ad0bb11b5d5b81c6de08e6cd970102e33da667 |
libdash -0.3.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 563e2554ae31ba3e7afb20fb2d600381982f7ca62c8414e77749a489c25116e6 |
|
| MD5 | 3ba4fb070929bfc3e6fb0d71483c828b |
|
| 布莱克2-256 | 54b8ef4aff2ef3f20060f52377ed086a0b002dde29f2396e67e9377fc83b8758 |
libdash -0.3.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | a82e5998826d762abd0f2b7e37a6847bd6bb668408383f04606c2127079b4583 |
|
| MD5 | 4b2cad42c2cbffcf4c6592a3f0a1d97b |
|
| 布莱克2-256 | 7c12569021fd0cce56ff2fe24a6d69aadf1b662b1078f66dcdfaaf6dcd4c0f78 |
libdash -0.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 75886db8a394aaac3a9364b146525ac09a87b28b4873a188098b308d675b09f2 |
|
| MD5 | d5db6adf875f96cfd7f91af677058bd5 |
|
| 布莱克2-256 | bf13b4f5a2a97b4192d4f8ff2cf7f534c4b8072070b8e01966cd12b71d255c29 |