質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

1回答

1055閲覧

Goでコマンドを作成したが上手く実行されない

MakotoH

総合スコア6

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2021/12/02 12:06

自作コマンドが動かない

Go言語でコマンドを作る練習をしていました。
しかし、作ったコマンドが上手く実行されないため質問をしました。

コマンドファイルがあるフォルダまでのPATHを通し、コマンドファイルには755権限を付与しました。
その上で実行しても上手くコマンドが実行されませんでした。
環境はmacOS Big Sur 11.6のターミナルで、z-shellを使ってます。

やったこと

  1. main関数を実行するmain.goファイルを作成。
  2. main関数から呼ばれるtestsrc.goファイルを作成。
  3. コマンドファイルtest-commandを作成。go run main.goを行う処理を記述。
  4. ファイルがあるディレクトリをモジュール化
  5. フォルダにPATHを通したり、コマンドファイルに755権限をつけたりする

ホームディレクトリの直下に下記の構成をしているフォルダを置いています。

ファイル構成とソースコード

ファイル構成(test-commandsフォルダ)

. ├── go.mod ├── main.go ├── test-command(コマンド実行ファイル) └── testsrc └── testsrc.go

test-command

#!/bin/zsh go run ~/test-commands/main.go

go.mod

module test-commands go 1.17

main.go

package main import "test-commands/testsrc" func main() { testsrc.Testsrc() }

testsrc.go

package testsrc import "fmt" func Testsrc() { fmt.Println("hello") }

結果

ターミナル上でホームディレクトリに移動して、test-commandを実行しました。
そうすると以下の表示が出てきます。

zsh

1makoto@MacBook ~ % test-command 2test-commands/main.go:3:8: package test-commands/testsrc is not in GOROOT (/usr/local/go/src/test-commands/testsrc)

カレントディレクトリをtest-commandsフォルダにし、test-commandを行うと問題は生じません。

zsh

1makoto@MacBook test-commands % test-command 2hello

ファイルの構成に問題がある考えていますが、調べても有効な解決策を見つけられなかったため質問をしました。

もし説明でわかりづらい部分があれば教えていただきたいです。
ご協力よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2021/12/02 12:09

go build で実行形式を作らずに go run で実行しているのは何か理由があるのでしょうか?
MakotoH

2021/12/02 12:34

ご質問ありがとうございます! go runもgo buildもコンパイルと実行ファイル作成行うので、その後に実行も合わせてやってくれるgo runを使ってました。 質問をいただいた後に調べたら、go buildだと全てのファイルを読み込みできることを知ったので、go buildの使い方を調べようと思います。
guest

回答1

0

ベストアンサー

Goモジュールが標準の挙動になってから変わったことがあります。

  • Goモジュールによる命名からサブパッケージが参照しやすくなり、GOPATH配下が必須ではなくなりました。
  • その代わりカレントフォルダまたは親フォルダ(Ancestors)にgo.modが必要になりました。

後者はセキュリティの都合上、預かり知らぬフォルダを名指しで「go build」できなくなっています。つまり「go run」もできません。なので、対処法としては

  • 「go run」で実行するのをやめる
  • Goモジュールを使わない古い方法で書き直し、GO111MODULE=offを環境変数に設定する

おすすめはもちろん前者です。

投稿2021/12/04 00:55

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakotoH

2021/12/04 04:54

モジュール化させたディレクトリをカレントディレクトリにし、go buildをしてバイナリを作って、そのバイナリをコマンドファイルで呼び出すようにしました。 そうしたら問題なく実行することができました。 預かり知らぬフォルダを名指しで「go build」できないというのは知らなかったので、大変助かりました。 教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問