Goで特定のURLを規定のブラウザで開かせたかった。 macなら open、Linuxなら xdg-openexec.Command に渡してやればよい。

んで、Windows ではコマンドプロンプトだと start URL で同じ挙動をするのだが、Goからだと動かなかった。

package main

import "os/exec"

func main() {
  err := exec.Command("start", "https://www.google.co.jp").Start()
  if err != nil {
    panic(err)
  }
}

こんなコードを Windows で動かしてみると panic: exec: "start": executable file not found in %PATH% となる。start コマンドはコマンドプロンプト内蔵コマンドであり、start.exe なんてものは存在しないのでコマンドプロンプト経由じゃないと動かないようだ。

exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", "https://www.google.co.jp").Start()

とすれば動く。

package main

import "os/exec"

func main() {
  config := LoadConfig()
  err := exec.Command(config.OpenCommand, "https://www.google.co.jp").Start()
  if err != nil {
    panic(err)
  }
}

実際のコードはこんな感じなので、引数が増えるのはめんどくさい。とはいえ仕方ないので

package main

import "os/exec"

func main() {
  config := LoadConfig()
  cmd := config.OpenCommand[0]
  args := config.OpenCommand[1:]
  args = append(args, "https://www.google.co.jp")
  err := exec.Command(cmd, args...).Start()
  if err != nil {
    panic(err)
  }
}

こんな感じにした。特定のオプションを指定したい人もいるだろうから汎用的になっていい感じかもしれない。