我试图找出一种从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的路径或实际内容 - 两者都不起作用。
任何想法如何实现这一目标?
答案 0 :(得分:25)
要使您的shell脚本可以直接运行,您必须:
使用#!/bin/sh
(或#!/bin/bash
等)启动它。
您必须将其设为可执行文件,即chmod +x script
。
如果您不想这样做,那么您必须使用脚本的路径执行/bin/sh
。
cmd := exec.Command("/bin/sh", mongoToCsvSH)
答案 1 :(得分:2)
您需要执行/bin/sh
并将脚本本身作为参数传递。
答案 2 :(得分:2)
这对我有用
func Native() string {
cmd, err := exec.Command("/bin/sh", "/path/to/file.sh").Output()
if err != nil {
fmt.Printf("error %s", err)
}
output := string(cmd)
return output
}