# shx
**Repository Path**: MM-Q/shx
## Basic Information
- **Project Name**: shx
- **Description**: 一个基于 mvdan.cc/sh/v3 的纯 Go Shell 命令执行库
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-06-18
- **Last Updated**: 2026-06-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Go语言, shell
## README
# Shx
[](https://golang.org) [](https://gitee.com/MM-Q/shx/blob/master/LICENSE) [](https://gitee.com/MM-Q/shx)
**一个基于 mvdan.cc/sh/v3 的纯 Go Shell 命令执行库**
[🏠 仓库地址](https://gitee.com/MM-Q/shx) • [📖 API 文档](APIDOC.md)
---
## 项目简介
Shx 是一个基于 [mvdan.cc/sh/v3](https://mvdan.cc/sh/v3) 的纯 Go Shell 命令执行库,不依赖系统 shell,提供跨平台一致的命令执行体验。
- **纯 Go 实现** — 不依赖系统 shell,Windows/Linux/macOS 行为一致
- **Bash 方言默认** — 支持 `[[ ]]`、`function`、`select` 等 Bash 特有语法
- **脚本文件执行** — 原生支持执行 `.sh` 脚本文件
- **链式调用 API** — 流畅的方法链,支持工作目录、环境变量、超时等配置
---
## 安装
```bash
go get gitee.com/MM-Q/shx@latest
```
Go 版本要求:1.25.0 或更高
---
## 核心特性
| 特性 | 说明 |
|------|------|
| **纯 Go 实现** | 基于 mvdan.cc/sh/v3,不依赖系统 shell |
| **Bash 方言默认** | 默认使用 Bash 方言解析器,支持 `[[ ]]`、`function`、`select` 等 Bash 特有语法 |
| **脚本文件执行** | 原生支持执行 `.sh` 脚本文件 |
| **链式调用** | 支持流畅的方法链配置 |
| **超时控制** | 支持上下文超时和超时参数 |
| **输入输出重定向** | 灵活的标准输入输出配置 |
| **退出码检测** | `IsExitStatus` 可提取命令退出码 |
| **结构体字面量** | 导出字段支持直接通过结构体配置 |
---
## 使用示例
```go
package main
import (
"fmt"
"log"
"time"
"gitee.com/MM-Q/shx"
)
func main() {
// ---- 便捷函数 ----
shx.Run("echo hello") // 简单执行
shx.RunToTerminal("ls -la") // 输出到终端
output, _ := shx.Out("date") // 获取输出
fmt.Println(string(output))
shx.RunWith("sleep 10", 5*time.Second) // 超时执行
// ---- 链式配置 ----
out, err := shx.New("echo hello").
WithTimeout(5 * time.Second).
WithDir("/tmp").
WithEnv("FOO", "bar").
ExecOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
// ---- 使用上下文 ----
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
err = shx.New("long-command").WithContext(ctx).Exec()
// ---- 自定义输入输出 ----
var stdout, stderr bytes.Buffer
stdin := strings.NewReader("input")
err = shx.New("cat").
WithStdin(stdin).
WithStdout(&stdout).
WithStderr(&stderr).
Exec()
// ---- 执行脚本文件 ----
shx.RunScript("deploy.sh")
output, err = shx.OutScript("build.sh")
out, err = shx.NewScript("test.sh").
WithDir("/project").
WithEnv("MODE", "ci").
WithTimeout(30 * time.Second).
ExecOutput()
// ---- 检查退出码 ----
err = shx.Run("exit 5")
if code, ok := shx.IsExitStatus(err); ok {
fmt.Printf("Exit code: %d\n", code)
}
}
```
---
## 注意事项
- Shx 对象的配置方法(WithXxx)不是并发安全的,不要在多个 goroutine 中并发配置
- mvdan/sh 是同步执行的,不提供异步 API,如需异步请使用 goroutine 包装
- 不支持进程控制(无 PID、Kill、Signal),只能通过 context 取消
- 默认使用 Bash 方言解析(`syntax.LangBash`),支持 `[[ ]]`、`function`、`select` 等 Bash 特有语法
---
**如果这个项目对您有帮助,请给它一个 ⭐ Star!**
[⬆顶部](#shx)