at backyard

Color my life with the chaos of trouble.

Goのexec.Commandでデフォルトブラウザを用いてURLを開くはずが、ファイルを開こうとしてしまい詰まった

この記事はGoの1.18.1で検証しています。

go version go1.18.1 darwin/arm64

ちなみに1.19ではここらへんに修正が入るようですが、まだちゃんと見ていないので公式ドキュメントを貼っておきます。

exec package - os/exec - Go Packages

さて、本題。
例えば下記のようなコードがあるとする。
selectUrlにはURLが格納されていて、mac上のデフォルトブラウザでこのURLを開きたい、というコードである。

cmd := exec.Command("open", selectUrl)
cmd.Stderr = &stderr

err = cmd.Run()
if err != nil {
    fmt.Printf("Open browser failed %v\n%v\n", err, stderr.String())
    os.Exit(1)
}

たが、しかしこのコードは実行するとエラーになる。
エラーの内容は下記。

The file /<カレントディレクトリの絶対パス>/<開きたいURL>                                           does not exist.

このようにURLの頭にカレントディレクトリがついてきてしまう。

なぜこんなことになっているか?

exec.Commandにパスを渡す際に空白がついているかを確認すること

実は selectUrl で定義したURLには開きたいURL以外に、URLの末尾に空白が入っていた。
URLに空白が含まれてしまう場合、上記のようにファイルパスとして扱われてしまうようだった。

原因が分かればなんてことのないことなのだが、ググっても全く同じような記事は出てこないし、皆普通にデフォルトブラウザでURL開けているし、よく分からない時間がしばらく流れていて焦った。

以上。