この記事は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開けているし、よく分からない時間がしばらく流れていて焦った。
以上。