【问题标题】:How to use commands inside a makefile when I don't have permission?当我没有权限时,如何在生成文件中使用命令?
【发布时间】:2020-03-11 02:03:58
【问题描述】:

我目前正在尝试运行我的 makefile,如下所示:

run program:
        export CUDA_VISIBLE_DEVICES=1
        python ~/program/main.py --setup2

当我尝试运行export shell 命令时收到Permission denied 错误。我假设原因是因为我目前正在使用实验室的服务器来运行该程序,并且通常只有指定的少数人被授予对服务器的许多功能的权限。

但是,每当我“手动”运行此命令(即我自己在终端中输入 makefile 的两行)时,它都运行良好。

我还查看了 How to use shell commands in Makefileshell script run when I am root but I get a permission denied when it is invoked from a Makefile (still as root) 并尝试将行 export CUDA_VISIBLE_DEVICES=1 更改为 "$(export CUDA_VISIBLE_DEVICES=1)""$(shell export CUDA_VISIBLE_DEVICES=1)" 但我得到了相同的权限错误。

有什么办法可以解决这个问题,还是我必须与服务器管理员交谈?谢谢。

【问题讨论】:

  • Make 的 export 指令和 shell export 命令不是一回事。但这里的主要问题是权限错误。我很惊讶这个错误甚至存在,而且我不知道足够的系统管理来理解它为什么会发生。我建议您在命令行中尝试echo $SHELL; whoami,在makefile 规则中尝试echo $$SHELL; whoami,以排除一些问题。另外,您使用的是哪个版本的 Make? (您可以通过make -v查看。)
  • 我的make版本是4.1,当我按照你的建议运行文件时,我得到了输出/bin/bash \ user。输出与我在终端中运行echo 命令时的输出相同。
  • 使用'make -d run'获取调试信息。另外,你能分享命令行和完整的日志文件吗?
  • 我认为您对错误发生的位置做出了无效的假设:export 不是命令,也不会导致 permission denied 错误。您能否提供一个产生错误的完整示例以及确切输出,以及您从该示例中看到的错误?

标签: makefile


【解决方案1】:

make 导出和shell 导出之间可能存在一些混淆。

在规则之外,'export' 是指令,操纵 make 环境 - 通常在子 make 之间通信的上下文中。

当你把它放到一个规则中(在 之后),它将被它自己的子 shell 执行,这将是一个无操作(下一行的 python 命令不与导出共享 env第一行)。考虑将规则更改为:

run program:
<TAB>    CUDA_VISIBLE_DEVICES=1 python ~/program/main.py --setup2

出于好奇,为什么这里使用了两个目标(运行、程序)?

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 2021-08-21
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多