带有:
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带有sedand cut),然后在rsync和其他命令中使用结果。我是否需要一遍又一遍地重复冗长的命令?我不能将结果存储在内部的Make变量中吗?