FreeBSD make使用大括号语法复制多文件失败,求适配方案
FreeBSD Make 大括号扩展问题的解决方案
问题原因
FreeBSD 原生的/usr/bin/make不会将命令直接传递给指定的Shell(比如bash)处理,它会先自行解析命令行,因此不支持Shell的大括号扩展语法{file1,file2}。而GNU make(gmake)会直接把命令交给指定Shell处理,所以能正常解析大括号。
适配FreeBSD Make的调整方法
方法1:显式调用bash执行带大括号的命令
将命令用bash -c包裹,让bash负责解析大括号扩展:
SHELL=/bin/bash copy: @bash -c 'cp /dir1/dir2/{file1,file2} /dir3/'
方法2:使用Make的循环遍历文件列表
借助Make的变量和Shell循环,避免依赖大括号扩展:
TARGET_FILES = file1 file2 copy: @for fname in $(TARGET_FILES); do cp /dir1/dir2/$$fname /dir3/; done
注意这里用$$fname是为了转义Make的变量解析,让Shell能正确拿到文件名变量。
方法3:直接列出所有目标文件
如果文件数量不多,直接在cp命令中列出所有文件,最简单直接:
copy: @cp /dir1/dir2/file1 /dir1/dir2/file2 /dir3/
内容的提问来源于stack exchange,提问作者ABHISHEK PATIL
相关产品推荐
相关产品推荐

