首页 > 后端开发 > Golang > 正文

使用 Go 执行动态 bash 脚本,包括一行函数声明

WBOY
发布: 2024-02-05 23:09:11
转载
1040人浏览过

使用 go 执行动态 bash 脚本,包括一行函数声明

问题内容

我正在用 go 编写一个 bash 任务运行程序,它有一个简单的概念:

  1. 它读取 taskfile ,这是一个包含任务定义(简单的 bash 函数声明)的 bash 脚本
  2. 它动态添加附加内容
  3. 根据传递的参数执行命令

这是一个简化的示例:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    //simplified for a dynamically built script
    taskfilecontent := "#!/bin/bash\n\ntask:foo (){\n  echo \"test\"\n}\n"
    // simplified for passed arguments
    task := "\ntask:foo"
    bash, _ := exec.lookpath("bash")
    cmd := exec.command(bash, "-c", "\"$(cat << eof\n"+taskfilecontent+task+"\neof\n)\"")
    fmt.println(cmd.string())
    out, _ := cmd.combinedoutput()
    fmt.println(string(out))
}
登录后复制

我现在的问题是,如果通过 go 执行它就不起作用,并且我收到此错误

task:foo: no such file or directory
登录后复制

但是如果我直接在 shell 中执行生成的脚本,它确实有效:

$ /opt/opt/homebrew/bin/bash -c "$(cat << EOF
#!/bin/bash

task:foo (){
  echo "test"
}

task:foo
EOF
)"

test   <-- printed out from the `task:foo` above
登录后复制

我在这里做错了什么?


正确答案


首先:这里没有任何意义。

你不会得到任何你不会得到的东西:

cmd := exec.command(bash, "-c", taskfilecontent+"\n"+task)
登录后复制

如果省略它,您的代码会更简单。

第二:解释原因

当您在 shell 中运行时:

65be85239床5

...围绕 $() 的 "s 不是正在启动的 bash 副本的语法,而是正在解析命令的 bash 副本的语法。 /em>。它们告诉 bash 的副本,命令替换的结果将作为一个字符串传递,不受字符串分割或通配符的影响。

类似地, $(cat

在您的 go 程序中,您没有交互式 shell,因此您应该使用 go 语法(而不是 shell 语法)来执行所有这些步骤。就这些步骤而言,没有理由在转到第一个位置(没有必要将数据文件写入临时文件,没有必要让 /bin/cat 读取该文件的内容,没有必要使用子进程运行命令替换来生成一个字符串(由这些内容组成),然后将其放在最终 shell 的命令行中),因此忽略所有这些步骤会更明智。

以上就是使用 Go 执行动态 bash 脚本,包括一行函数声明的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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