在Linux sh/bash shell中,我可以使用UID_CODE=$(id -u):$(id -g)
获取Linux用户ID。它通常给出UID_CODE=1000:1000
然而,我正在写一个Makefile,类似于这个:
run:
UID_CODE=$(id -u):$(id -g) ./a.out
Makefile给出的UID_CODE=:
只是:
我做了一些挖掘,发现我需要使用$$
,但$$(id -u):$$(id -g)
给了我UID_CODE=$(id -u):$(id -g)
如何获得与shell中相同的结果?
这肯定会奏效,而且可能是最好的方法,除非你需要在很多规则中完成:
run:
UID_CODE=$$(id -u):$$(id -g) ./a.out
没有一个好的理由使用GNU来制作像shell
函数这样的特定功能。
我不知道你说的是什么意思:给我UID_CODE=$(id -u):$(id -g)
你的意思是,这就是打印出来的原因吗?是的,那很好。make打印出它将运行的shell命令,就像在shell提示符中键入它一样。
当shell运行该命令时,它将展开$(id -u)
并用正确的UID替换它。例如,您可以测试以下内容:
run:
UID_CODE=$$(id -u):$$(id -g) env | grep UID_CODE
在此处运行make将打印以下内容:
UID_CODE=$(id -u):$(id -g) env | grep UID_CODE
UID_CODE=1000:1000
(或您的UID/GID值(。第一行是make,显示它将运行的命令,第二行是命令的输出,显示UID_CODE
已按预期设置。
下面是一个示例makefile,它设置了一个变量,并通过环境将其传递给规则中的外部程序(您可以使用${...}
或$(...)
(:
$ cat Makefile.mk
FOO := "foo: $(shell id -g):$(shell id -u)"
tst:
echo "testing: $(FOO)"
FOO=${FOO} ./a.out
这使用的是$(shell ...)
的GNU makefile功能,但您可能使用的是GNU make,所以这应该不是问题。