Makefile中mkdir多目录创建异常:为何生成带大括号的目录?
问题根源与解决办法
这个问题的核心在于Make默认使用的Shell和你命令行用的Shell不一样:
- 你在命令行执行
mkdir -vp ".cache/vim/"{backup,swap}时,用的是Bash(或其他支持大括号扩展的Shell),Bash会自动把{backup,swap}展开成backup和swap两个目录名,因此能创建两个目标目录。 - 但Make默认调用的是
/bin/sh(很多系统上是Dash或者POSIX标准的Shell),这类Shell不支持Bash特有的大括号扩展(brace expansion),它会把{backup,swap}当成一个完整的文件名,所以最终只创建了单个名为{backup,swap}的目录。
下面是几种可行的解决方法:
方法1:让Make全局使用Bash
在Makefile的最开头添加一行,指定Make用Bash执行所有命令:
SHELL := /bin/bash folder: @mkdir -vp ".cache/vim/"{backup,swap}
这样后续所有命令都会用Bash处理,大括号扩展就能正常工作了。
方法2:手动展开目录名(兼容性最好)
如果不想依赖特定Shell,直接把两个目录都写出来,这样不管用什么Shell都能执行:
folder: @mkdir -vp ".cache/vim/backup" ".cache/vim/swap"
方法3:仅为这条命令调用Bash
如果只需要这一条命令用Bash,其他命令保持默认Shell,可以显式调用Bash来执行:
folder: @bash -c 'mkdir -vp ".cache/vim/"{backup,swap}'
内容的提问来源于stack exchange,提问作者huynle
相关产品推荐
相关产品推荐

