它实际上是执行命令,将目录更改为some_directory,但是,这是在子进程shell中执行的,并且既不影响make也不影响您正在使用的shell。
如果你想在some_directory中执行更多的任务,你需要添加一个分号,并附加其他命令。请注意,您不能使用换行符,因为它们将make解释为规则的结尾,因此用于清晰度的任何换行符都需要通过反斜杠转义。
例如:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
还要注意,即使您添加了反斜杠和换行符,每个命令之间也必须使用分号。这是因为整个字符串被shell解析为一行。如评论中所述,您应该使用&&’以加入命令,这意味着它们只有在前面的命令成功时才被执行。
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
这在进行破坏性工作(例如清理)时尤为重要,因为如果光盘因任何原因失败,您将会毁坏错误的东西。
一个常见的用法是在子目录中调用make,您可能想要查看。有一个命令行选项,所以你不必自己调用cd,所以你的规则会是这样的
all:
$(MAKE) -C some_dir all
它将变成some_dir并在那里执行Makefile,目标为“all”。作为一个最佳实践,使用$(MAKE)而不是直接调用make,因为它会注意调用正确的make实例(例如,如果您为构建环境使用特殊make版本),以及提供当使用某些开关(例如-t)运行时,行为略有不同。
对于记录,总是回显它执行的命令(除非明确抑制),即使它没有输出,这是你看到的。