我正在为Ubuntu做一个简单的游戏并更新高分列表,它在运行时需要一个文件,名为'highscores.bin'。
我希望将此文件放在
/home/(USER)/.game_name
我研究了一下,发现从Makefile里面我可以得到环境变量$ USER。 所以在Makefile中,在'install'目标中,我添加了:
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。
答案 0 :(得分:13)
好吧,如果你想在运行时使用该文件,我建议你在运行时创建它。 Makefile仅在编译期间被考虑。如果程序被编译然后由不同的用户执行,这显然是一个问题,其中一些用户甚至可能在编译时不存在。
在运行时,您可以获得如here所示的主目录(如果您使用的是C / C ++)。然后,您可以检查highscore文件夹/文件是否存在,并在需要时创建它。如果您想为所有用户提供高分文件,则应将其放在特殊用户的主目录中,而不是文件系统中的其他位置。这例如由游戏xjump完成。
关于你的Makefile,由于 sudo 命令,$ USER变量被翻译为root
sudo make install
实际运行make的用户是超级用户:root。
答案 1 :(得分:5)
您想为每位用户安装程序吗?因此,如果您在用户运行游戏时创建 /home/user/.game_name 目录,而不是在root用户安装时,则会更好。否则,只有呼叫sudo make install
的用户才会拥有高分榜。如果您只有一个用户,请不要在系统范围内安装,而是在用户目录中安装。
我建议在游戏首次运行时初始化用户文件。因此,每个用户,甚至是安装游戏时不存在的用户,都可以获得高分榜。您可以将初始化代码添加到游戏中(c ++,java或其他任何东西),或者只调用执行它的外部脚本(不那么优雅)。避免在安装时创建与用户相关的文件。