如何在 Golang 函数中使用 bash 脚本的输出
how to use the output of a bash script in a Golang function
这甚至可能是不可能的,但过去一个小时我一直在研究,但一无所获。我有一个 bash 脚本,它给我特定的输出,我想将该输出添加到 Golang,以便根据 bash 脚本的输出重定向网站。抱歉,如果这没有意义,我是 Go 的新手
这是我必须 运行 bash 脚本并输出值
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf(string(out))
}
然后我想在另一个函数中使用那里输出的值并重定向 URL 这是我将如何重定向到 url 我希望 $variable
到被添加。这只是我从互联网上复制的一个示例,但它是我想要复制的。
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "**$variable**", 301)
}
func main() {
http.HandleFunc("/", redirect)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
假设您的脚本在启动时必须只 运行 一次,那么这应该可以解决问题:
var redirectTo string
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, redirectTo, 301)
}
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
redirectTo = string(out)
http.HandleFunc("/", redirect)
err = http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
或者如果您不想拥有全局变量,您可以在 运行 时间生成重定向函数:
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, string(out), 301)
})
err = http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
如果你想在out为空时进行处理,你可以这样做:
func redirect(w http.ResponseWriter, r *http.Request) {
if len(redirectTo) == 0 {
http.Error(w, "No URL parsed!", 500)
return
}
http.Redirect(w, r, redirectTo, 301)
}
在这种情况下,这将 return HTTP 错误 500。
您也可以直接退出程序而不是服务:
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
if len(out) == 0 {
log.Fatal("no output was returned from script")
}
如果您愿意,您还可以在此处向 out
添加更多验证,例如它是否正确 URL,使用 net/url
包。
这甚至可能是不可能的,但过去一个小时我一直在研究,但一无所获。我有一个 bash 脚本,它给我特定的输出,我想将该输出添加到 Golang,以便根据 bash 脚本的输出重定向网站。抱歉,如果这没有意义,我是 Go 的新手
这是我必须 运行 bash 脚本并输出值
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf(string(out))
}
然后我想在另一个函数中使用那里输出的值并重定向 URL 这是我将如何重定向到 url 我希望 $variable
到被添加。这只是我从互联网上复制的一个示例,但它是我想要复制的。
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "**$variable**", 301)
}
func main() {
http.HandleFunc("/", redirect)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
假设您的脚本在启动时必须只 运行 一次,那么这应该可以解决问题:
var redirectTo string
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, redirectTo, 301)
}
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
redirectTo = string(out)
http.HandleFunc("/", redirect)
err = http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
或者如果您不想拥有全局变量,您可以在 运行 时间生成重定向函数:
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, string(out), 301)
})
err = http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
如果你想在out为空时进行处理,你可以这样做:
func redirect(w http.ResponseWriter, r *http.Request) {
if len(redirectTo) == 0 {
http.Error(w, "No URL parsed!", 500)
return
}
http.Redirect(w, r, redirectTo, 301)
}
在这种情况下,这将 return HTTP 错误 500。
您也可以直接退出程序而不是服务:
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
if len(out) == 0 {
log.Fatal("no output was returned from script")
}
如果您愿意,您还可以在此处向 out
添加更多验证,例如它是否正确 URL,使用 net/url
包。