Ada*_*tan 88 bash makefile echo
我正在尝试使用ls其他命令的结果(例如echo,rsync):
all:
<Building, creating some .tgz files - removed for clarity>
FILES = $(shell ls)
echo $(FILES)
Run Code Online (Sandbox Code Playgroud)
但我得到:
make
FILES = Makefile file1.tgz file2.tgz file3.tgz
make: FILES: No such file or directory
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用echo $$FILES,echo ${FILES}并且echo $(FILES),没有运气.
tor*_*rek 130
附:
FILES = $(shell ls)
Run Code Online (Sandbox Code Playgroud)
all像这样缩进,这是一个构建命令.所以这会扩展$(shell ls),然后尝试运行命令FILES ....
如果FILES应该是make变量,则需要在配方部分之外分配这些变量,例如:
FILES = $(shell ls)
all:
echo $(FILES)
Run Code Online (Sandbox Code Playgroud)
当然,这意味着在运行创建.tgz文件的任何命令之前,FILES将设置为"output from ls" .(虽然Kaz注意到每次重新扩展变量,所以最终它将包含.tgz文件; 为了效率和/或正确性,一些变体必须避免这种情况.1)FILES := ...
如果FILES应该是一个shell变量,你可以设置它,但你需要在shell-ese中做,没有空格,并引用:
all:
FILES="$(shell ls)"
Run Code Online (Sandbox Code Playgroud)
但是,每一行都由一个单独的shell运行,因此该变量不会存活到下一行,因此您必须立即使用它:
FILES="$(shell ls)"; echo $$FILES
Run Code Online (Sandbox Code Playgroud)
这有点傻,因为shell会*首先为你扩展(和其他shell glob表达式),所以你可以:
echo *
Run Code Online (Sandbox Code Playgroud)
作为你的shell命令.
最后,作为一般规则(不适用于此示例):作为评论中的世界语注释,使用输出ls并不完全可靠(某些细节取决于文件名,有时甚至是版本ls;某些版本的ls尝试消毒输出在某些情况下).因此,作为l0b0和idelic note,如果您正在使用GNU make,您可以使用$(wildcard)并$(subst ...)完成其内部的所有内容make(避免任何"文件名中的奇怪字符"问题).(在sh脚本中,包括makefile的配方部分,另一种方法是使用find ... -print0 | xargs -0以避免跳过空格,换行符,控制字符等.)
1 GNU Make文档进一步指出POSIX ::=在2012年增加了作业.我没有为此找到POSIX文档的快速参考链接,也不知道哪些make变体支持::=赋值,尽管GNU make今天做了,具有相同的含义:=,即现在使用扩展进行赋值.
请注意,根据我所知,VAR := $(shell command args...)也可以拼写VAR != command args...多种make变体,包括所有现代GNU和BSD变体.这些其他变体没有$(shell)这样的使用在更VAR != command args...短和在更多变体中工作方面都是优越的.
Kaz*_*Kaz 46
此外,除了torek的答案之外:有一点很突出,那就是你正在使用一个懒惰评估的宏分配.
如果您使用的是GNU Make,请使用:=赋值而不是=.此分配使右侧立即展开,并存储在左侧变量中.
FILES := $(shell ...) # expand now; FILES is now the result of $(shell ...)
FILES = $(shell ...) # expand later: FILES holds the syntax $(shell ...)
Run Code Online (Sandbox Code Playgroud)
如果使用=赋值,则意味着每次出现$(FILES)都会扩展$(shell ...)语法,从而调用shell命令.这会使你的make工作运行得更慢,甚至会产生一些令人惊讶的后果.