【问题标题】:How do i get the user name in a Makefile?如何在 Makefile 中获取用户名?
【发布时间】:2012-01-04 07:39:40
【问题描述】:

我正在为 Ubuntu 制作一个简单的游戏并更新高分列表,它在运行时需要一个名为“highscores.bin”的文件。

我想把这个文件放在

/home/(USER)/.game_name

我进行了一些研究,发现从 Makefile 中我可以获取环境变量 $USER。 因此,在 Makefile 中,在“安装”目标处,我添加了:

mkdir -p $(DESTDIR)home/$$USER/.game_name

但是当我运行“sudo make install”时,Makefile 将其安装为:

/home/root/.game_name

如何在 Makefile 中获取(非 root)用户名?

P.S.:我正在手动编写 Makefile。没有./configure

P.S.2:我不想做

mkdir -p ~/.game_name

因为如果我想安装到临时目录,我希望能够更改 DESTDIR。

【问题讨论】:

  • 值得指出的是,不能保证给定用户的主目录会位于/home/username(例如root 的主目录通常是/root) - 使用@987654328改为@环境变量。
  • 为什么在谷歌上这么难找到?缺乏对这种特定情况的讨论令人担忧。

标签: linux makefile installation home-directory


【解决方案1】:

好吧,如果您在运行时需要该文件,我建议您在运行时创建它。 Makefile 仅在编译时考虑。如果程序被编译然后由不同的用户执行,这显然是一个问题,其中一些甚至可能在编译时不存在。

在运行时,您可以获得如here 所示的主目录(如果您使用的是 C/C++)。然后,您可以检查高分文件夹/文件是否存在,并在需要时创建它。如果你想要一个所有用户的高分文件,你应该把它放在一个特殊用户的主目录中,而不是放在文件系统的其他地方。这例如由游戏 xjump 完成。

关于你的 Makefile,$USER 变量被转换为 root 因为 sudo 上的命令

sudo 安装

实际运行 make 的用户是超级用户:root。

【讨论】:

  • 感谢您的回答!我没有想到另一个用户执行它并且没有'hightcores.bin'文件。但是如果我在 /usr/local/bin 安装二进制文件,所有用户都可以访问它吗?
  • /usr/local/bin 一般普通用户是不可写的,应该只包含可执行文件。在我的 gentoo 系统上,共享分数的游戏将它们放在 /var/games 中(您需要在安装时进行,然后 chmod 660; chgrp games 它,以便用户可以更新它)(并且您应该使该路径易于更改,因为其他发行版可能有不同的目录布局)
【解决方案2】:

您想为每个用户安装您的程序吗?所以最好在用户运行游戏时创建/home/user/.game_name 目录,而不是在root 安装时创建。否则,只有调用sudo make install 的用户才会有它的高分列表。如果你只有一个用户,不要在系统范围内安装它,而是在用户目录中。

我建议在游戏第一次运行时初始化用户文件。所以每个用户,即使是安装游戏时不存在的用户,都可以拥有自己的高分榜。您可以将初始化代码添加到您的游戏中(c++、java 或其他任何东西),或者只是调用执行它的外部脚本(不是那么优雅)。避免在安装时创建与用户相关的文件。

【讨论】:

  • 谢谢!在第一次运行时创建用户文件很有意义。很抱歉我一开始没看懂你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2013-11-28
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多