带有:
FILES = $(shell ls)
all
像这样缩进,这是一个构建命令。因此,这会扩展$(shell ls)
,然后尝试运行命令FILES ...
。
如果FILES
应该是make
变量,则需要在配方部分之外分配这些变量,例如:
FILES = $(shell ls)
all:
echo $(FILES)
当然,这意味着FILES
将在运行创建.tgz文件的任何命令之前将其设置为“从...输出ls
” 。(虽然如卡兹注意到变量每次重新扩大,所以最终会包括.tgz的文件;一些化妆变体具有避免这种情况,以提高效率和/或正确性。1)FILES := ...
如果FILES
应该是shell变量,则可以设置它,但是需要用shell-ese来做,没有空格,并用引号引起来:
all:
FILES="$(shell ls)"
但是,每一行都由单独的外壳程序运行,因此此变量将无法保留到下一行,因此您必须立即使用它:
FILES="$(shell ls)"; echo $$FILES
这有点愚蠢,因为外壳首先会*
为您扩展(以及其他外壳glob表达式),因此您可以:
echo *
作为您的shell命令。
最后,作为一般规则(不适用于此示例):正如世界语在注释中所指出的那样,使用from的输出ls
并不完全可靠(某些详细信息取决于文件名,有时甚至取决于的版本ls
;某些ls
试图清除输出的版本在某些情况下)。因此,如l0b0和理想注释所示,如果您使用的是GNU,则可以使用$(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...
在缩短变体和在更多变体中工作方面具有优势。
ls
带有sed
and cut),然后在rsync和其他命令中使用结果。我是否需要一遍又一遍地重复冗长的命令?我不能将结果存储在内部的Make变量中吗?