Repolode
mvdan

mvdan/sh

一个 Go 语言的 shell 解析、格式化与解释器库,附带 shfmt 格式化工具,支持 Bash、Zsh 等。

Star
9,182
Fork
465
未关闭 Issue
78
最近提交
4天前

这是什么?

mvdan/sh 是一个用纯 Go 编写的 shell 解析器、格式化工具和解释器,支持 POSIX Shell、Bash、Zsh 和 mksh 语法。它可以把脚本解析为语法树,便于检查或以程序方式改写。

项目附带命令行格式化工具 shfmt,可按统一风格格式化 shell 脚本,并支持原地写回文件。它已提供 Alpine、Debian、Fedora、Homebrew、Scoop、Docker、PyPI 等多种安装方式,VS Code、Emacs、Vim 等编辑器也有对应插件。

除格式化外,shell 包提供命令行拆分、变量与 ~ 展开、通配符匹配等辅助函数;interp 包可在 Go 程序中直接运行脚本,无需系统 shell,并支持 Windows。由于是纯 Go 实现,子 shell 使用 goroutine 模拟,而非真实进程。

核心功能

  • 01将 POSIX、Bash、Zsh 和 mksh 脚本解析为语法树。
  • 02通过 shfmt 命令行工具格式化脚本,支持原地修改文件。
  • 03无需系统 shell 即可在 Go 中运行脚本,包括 Windows。
  • 04提供命令行拆分、引用、变量展开和通配符匹配等辅助函数。
  • 05提供 Docker 镜像,并已打包到多个操作系统的软件源中。

适用场景

  • 在团队仓库中通过 CI 或 pre-commit 统一 shell 脚本风格。
  • 开发需要以程序方式分析或改写 shell 脚本的 Go 工具。
  • 在 Go 应用中嵌入可控权限的 shell 解释器。
  • 借助现有插件在编辑器中格式化 shell 代码。

快速上手

  1. 1

    使用 Go 安装 shfmt 命令行工具

    go install mvdan.cc/sh/v3/cmd/shfmt@latest
  2. 2

    原地格式化 shell 脚本

    shfmt -l -w script.sh

使用前须知

  • 从源码安装需要 Go 1.26 或更高版本。
  • 子 shell 在 goroutine 中运行,因此解释器无法使用真实的 PID 和文件描述符。
  • 不支持 `$((` 与 `((` 的歧义语法。

收录于专题

标签

常见问题

sh 是什么?
一个 Go 语言的 shell 解析、格式化与解释器库,附带 shfmt 格式化工具,支持 Bash、Zsh 等。 mvdan/sh 是一个用纯 Go 编写的 shell 解析器、格式化工具和解释器,支持 POSIX Shell、Bash、Zsh 和 mksh 语法。它可以把脚本解析为语法树,便于检查或以程序方式改写。
sh 可以免费使用吗?用的什么许可证?
sh 以 BSD-3-Clause 许可证开源。用于商业产品前,请先确认许可证条款。
sh 还在维护吗?
活跃维护中。sh 最近一次提交是在 2026年11月3日。
sh 适合用来做什么?
在团队仓库中通过 CI 或 pre-commit 统一 shell 脚本风格。 开发需要以程序方式分析或改写 shell 脚本的 Go 工具。 在 Go 应用中嵌入可控权限的 shell 解释器。 借助现有插件在编辑器中格式化 shell 代码。
sh 怎么安装和运行?
使用 Go 安装 shfmt 命令行工具: go install mvdan.cc/sh/v3/cmd/shfmt@latest 原地格式化 shell 脚本: shfmt -l -w script.sh
在哪里获取 sh?
源代码和安装说明在 GitHub 上:https://github.com/mvdan/sh

概要由 AI 根据项目 README 生成;GitHub 数据每日更新。

相关项目