0

0

如何在 Go 程序中正确执行 Bash 脚本

聖光之護

聖光之護

发布时间:2026-01-05 15:27:19

|

449人浏览过

|

来源于php中文网

原创

如何在 Go 程序中正确执行 Bash 脚本

本文详解如何使用 go 的 `os/exec` 包安全、可靠地执行本地 bash 脚本,涵盖路径处理、错误诊断、输出捕获及常见陷阱(如 exit status 127),并提供可直接运行的完整示例。

在 Go 中执行 Bash 脚本看似简单,但实际开发中常因路径错误、权限缺失或 shell 解析机制差异导致失败(例如 exit status 127 —— 这是 Unix/Linux 中“命令未找到”的标准错误码)。你遇到的问题正源于此:exec.Command("/bin/sh", "hello.sh") 尝试在 /bin/sh 目录下查找 hello.sh,而它实际位于当前工作目录(即 hello/ 根目录),因此 shell 无法定位脚本文件。

✅ 正确做法:指定绝对路径 + 捕获输出

首先确保 hello.sh 具备可执行权限:

chmod +x hello.sh

然后在 hello.go 中使用 exec.Command 配合 Output() 方法(推荐用于需获取 stdout 的场景):

视野自助系统小型企业版2.0 Build 20050310
视野自助系统小型企业版2.0 Build 20050310

自定义设置的程度更高可以满足大部分中小型企业的建站需求,同时修正了上一版中发现的BUG,优化了核心的代码占用的服务器资源更少,执行速度比上一版更快 主要的特色功能如下: 1)特色的菜单设置功能,菜单设置分为顶部菜单和底部菜单,每一项都可以进行更名、选择是否隐 藏,排序等。 2)增加企业基本信息设置功能,输入的企业信息可以在网页底部的醒目位置看到。 3)增加了在线编辑功能,输入产品信息,企业介绍等栏

下载
package main

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "path/filepath"
)

func runHelloScript() ([]byte, error) {
    // 获取当前 Go 文件所在目录(即 hello/)
    exePath, err := os.Executable()
    if err != nil {
        return nil, fmt.Errorf("failed to get executable path: %w", err)
    }
    dir := filepath.Dir(exePath) // 或使用 os.Getwd() 获取运行时工作目录

    // 构建 hello.sh 的绝对路径
    scriptPath := filepath.Join(dir, "hello.sh")

    // 执行脚本(注意:/bin/sh 是解释器,scriptPath 是参数)
    cmd := exec.Command("/bin/sh", scriptPath)

    // 捕获标准输出和标准错误
    out, err := cmd.Output()
    if err != nil {
        // exit status 127 通常意味着脚本路径错误或 /bin/sh 找不到该文件
        if exitErr, ok := err.(*exec.ExitError); ok {
            log.Printf("Script failed with exit code %d, stderr: %s", 
                exitErr.ExitCode(), string(exitErr.Stderr))
        }
        return nil, fmt.Errorf("failed to run hello.sh: %w", err)
    }
    return out, nil
}

func main() {
    output, err := runHelloScript()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Script output: %s", output) // 期望输出类似 ["a", "b", "c"]
}
? 提示:若 hello.sh 内容为 echo '["a", "b", "c"]',上述代码将准确打印该 JSON 字符串。

⚠️ 关键注意事项

  • 不要省略路径:exec.Command("/bin/sh", "hello.sh") 中 "hello.sh" 是相对路径,其解析依赖于 cmd.Dir(默认为当前工作目录)。建议显式设置 cmd.Dir = dir 或直接传入绝对路径,避免歧义。
  • 区分 Run()、Output() 和 CombinedOutput()
    • Run():仅等待执行完成,不返回输出;
    • Output():返回 stdout,若命令失败则 err 非空(stderr 不包含在返回值中);
    • CombinedOutput():合并 stdout 和 stderr,适合调试。
  • 权限与 Shell 特性:Go 不通过 shell 解析命令(如 exec.Command("ls *.go") 不会通配展开),因此调用脚本时必须显式指定解释器(如 /bin/sh)且脚本需有 +x 权限。
  • 安全性提醒:避免拼接用户输入到命令参数中,防止命令注入;如需动态参数,请使用 exec.Command 的多参数形式(而非 shell -c "...")。

通过以上方法,你不仅能解决 exit status 127 错误,还能构建健壮、可维护的脚本调用逻辑,适用于自动化任务、DevOps 工具或服务启动前的初始化流程。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

406

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

612

2023.11.24

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

53

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号