首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Makefile运行时被拒绝的权限

从Makefile运行时被拒绝的权限
EN

Stack Overflow用户
提问于 2022-09-30 12:24:58
回答 2查看 233关注 0票数 2

我正在经历一些奇怪的不允许错误,我不知道从哪里来。

代码语言:javascript
运行
复制
$ go run .
Hello from go
代码语言:javascript
运行
复制
$ make run
go run .
make: go: Permission denied
make: *** [Makefile:2: run] Error 127
代码语言:javascript
运行
复制
$ make run2
echo "Make says hello" ; go run .
Make says hello
Hello from go
代码语言:javascript
运行
复制
$ cat Makefile 
run:
    go run .

run2:
    echo "Make says hello" ; go run .
代码语言:javascript
运行
复制
$ cat main.go 
package main

import "fmt"

func main() {
    fmt.Println("Hello from go")
}

我的终端正在Ubuntu22.04上运行。

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

runrun2之间有什么不同,允许它在一种而不是在另一种情况下工作?

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

代码语言:javascript
运行
复制
$ 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
代码语言:javascript
运行
复制
$ make --trace run
Makefile:2: target 'run' does not exist
go run .
make: go: Permission denied
make: *** [Makefile:2: run] Error 127
代码语言:javascript
运行
复制
$ make --trace run2
Makefile:5: target 'run2' does not exist
echo "Make says hello"; go run .
Make says hello
Hello from go
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-30 17:20:29

这是由于gnulib中的一个bug (实际上它是gnulib中的一个bug )。这意味着您在go上的某个目录中有一个名为go的目录(在包含go可执行文件的实际目录之前)。

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

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

代码语言:javascript
运行
复制
run:
         go run . ;
票数 1
EN

Stack Overflow用户

发布于 2022-09-30 13:53:35

您所遇到的问题很可能是由于Makefile执行的shell和shell环境不同造成的。例如,如果您有一个用于go的shell别名,这个别名在Makefile中是不可见的,或者如果您的shell rc文件中有一个自定义路径,那么它对Makefile是不可见的。很难猜出区别在哪里。

您可能希望尝试通过在Makefile中执行以下操作来调试此问题

代码语言:javascript
运行
复制
echo $(PATH)
command -v go

并在shell中运行相同的命令并比较结果。

注意,Makefile的默认外壳是/bin/sh,而可能有bashzsh

下面是配置Makefile构建的一些方便的默认设置:

代码语言:javascript
运行
复制
LANG=en_US.UTF-8
SHELL=/bin/bash
.SHELLFLAGS=--norc --noprofile -e -u -o pipefail -c
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73908737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档