猿问

从 Golang 执行 Bash 脚本

我试图找出一种从 Golang 执行脚本 (.sh) 文件的方法。我找到了几种简单的方法来执行命令(例如 os/exec),但我想要做的是执行整个 sh 文件(文件设置变量等)。


为此使用标准的 os/exec 方法似乎并不简单:尝试输入“./script.sh”和将脚本内容加载到字符串中都不能作为 exec 函数的参数。


例如,这是我想从 Go 执行的 sh 文件:


OIFS=$IFS;

IFS=",";


# fill in your details here

dbname=testDB

host=localhost:27017

collection=testCollection

exportTo=../csv/


# get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys

keys=`mongo "$host/$dbname" --eval "rs.slaveOk();var keys = []; for(var key in db.$collection.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;

# now use mongoexport with the set of keys to export the collection to csv

mongoexport --host $host -d $dbname -c $collection --fields "$keys" --csv --out $exportTo$dbname.$collection.csv;


IFS=$OIFS;

来自 Go 程序:


out, err := exec.Command(mongoToCsvSH).Output()

    if err != nil {

        log.Fatal(err)

    }

    fmt.Printf("output is %s\n", out)

其中 mongoToCsvSH 可以是 sh 的路径或实际内容 - 两者都不起作用。


任何想法如何实现这一目标?


慕神8447489
浏览 332回答 3
3回答

杨魅力

为了让您的 shell 脚本可以直接运行,您必须:以#!/bin/sh(或#!/bin/bash等)开头。你必须让它可执行,也就是chmod +x script.如果您不想这样做,则必须/bin/sh使用脚本的路径执行。cmd := exec.Command("/bin/sh", mongoToCsvSH)

叮当猫咪

您需要执行/bin/sh并将脚本本身作为参数传递。
随时随地看视频慕课网APP

相关分类

Go
我要回答