从 Makefile 运行 go 时权限被拒绝

Kas*_*sen 3 makefile go

我遇到了一些奇怪的权限被拒绝错误,我不知道这些错误可能来自哪里。

$ go run .
Hello from go
Run Code Online (Sandbox Code Playgroud)
$ make run
go run .
make: go: Permission denied
make: *** [Makefile:2: run] Error 127
Run Code Online (Sandbox Code Playgroud)
$ make run2
echo "Make says hello" ; go run .
Make says hello
Hello from go
Run Code Online (Sandbox Code Playgroud)
$ cat Makefile 
run:
    go run .

run2:
    echo "Make says hello" ; go run .
Run Code Online (Sandbox Code Playgroud)
$ cat main.go 
package main

import "fmt"

func main() {
    fmt.Println("Hello from go")
}
Run Code Online (Sandbox Code Playgroud)

我的终端是在 Ubuntu 22.04 上运行的 bash。

我的目标和直接运行 go 之间有什么区别run,可能会导致权限被拒绝错误?

run允许run2它在一个中工作但在另一个中不起作用之间有什么区别?

编辑:使用-d/运行 make--trace

$ make -d run
<...snip...>
 No need to remake target 'Makefile'.
Updating goal targets....
Considering target file 'run'.
 File 'run' does not exist.
 Finished prerequisites of target file 'run'.
Must remake target 'run'.
go run .
make: go: Permission denied
make: *** [Makefile:2: run] Error 127
Run Code Online (Sandbox Code Playgroud)
$ make --trace run
Makefile:2: target 'run' does not exist
go run .
make: go: Permission denied
make: *** [Makefile:2: run] Error 127
Run Code Online (Sandbox Code Playgroud)
$ make --trace run2
Makefile:5: target 'run2' does not exist
echo "Make says hello"; go run .
Make says hello
Hello from go
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 10

这是由于 GNU make 中的一个错误(实际上是 gnulib 中的一个错误)造成的。这意味着您的某个目录中有一个名为 , 的目录在包含可执行文件的实际目录之前)。goPATHgo

因此,如果您有一个目录 /usr/bin/go/.并且您/usr/bin的 上有一个PATH目录,您就会看到这个问题。

您应该检查PATH并确保删除包含此类子目录的任何目录。如果您无法从您的目录中删除该目录PATH(需要包含子目录的目录是不常见的,PATH但我想这是可能的)并且您无法将该go目录重命名为其他目录,则必须确保 GNU make 调用 shell ,通过添加特殊字符。就;足够了:

run:
         go run . ;
Run Code Online (Sandbox Code Playgroud)