【问题标题】:how to use the output of a bash script in a Golang function如何在 Golang 函数中使用 bash 脚本的输出
【发布时间】:2022-01-11 18:44:59
【问题描述】:

这甚至可能是不可能的,但我过去一个小时一直在研究,结果一无所获。我有一个 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)
     }
 }

【问题讨论】:

  • 你的 bash 脚本在什么时候运行?启动时?

标签: go redirect environment-variables global-variables


【解决方案1】:

假设您的脚本只能在启动时运行一次,那么这应该可以解决问题:

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)
}

在这种情况下,这将返回 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 包。

【讨论】:

  • 如果 string(out) 有尾随空格,那么 OP 将需要 redirectTo = strings.TrimSpace(string(out))
  • 是的,您可以这样做,这取决于您是否确定您的脚本不会添加尾随空格、制表符或\n,例如
  • 当我运行你的两个解决方案时,我得到了一个错误“no new variables on left side of :=”,它指向第二个err := 我看到一个解决方案说要删除第二个err := 的冒号这会导致如果我删除它有什么问题吗?除此之外,一旦我删除了那个冒号,你的解决方案就完全按照我的意愿工作了。 @BenjaminBarrois
  • @BenjaminBarrois 我现在在打开网页ERR_TOO_MANY_REDIRECTS: localhost redirected you too many times. 时遇到此错误有没有办法修改脚本以仅在具有out 变量时才重定向?或者只是一种避免该错误的方法
  • 你说得对,我将:= 替换为=,因为err 变量已经声明(抱歉我没有测试我的代码)。
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
相关资源
最近更新 更多