Makefile中bash <(curl ...)组合的括号转义问题
解决Makefile中bash进程替换的括号转义问题
这个错误的根源其实有两个,咱们一步步拆解:
- Make默认用/bin/sh而非bash:
<(curl SOME_URL)是Bash专属的进程替换特性,POSIX标准的/bin/sh并不支持这个语法,所以直接执行会触发语法错误。 - Makefile对括号的特殊解析:
()在Make里是变量展开的标记,直接写的话会被Make优先解析,没法原样传递给shell。
下面给你两种可行的解决办法:
方法一:显式调用bash执行命令(推荐)
直接在容器命令里指定用bash执行带有进程替换的语句,用单引号把bash命令包裹起来,避免Make和容器内的sh解析出错:
foo: docker run $(IMAGE_NAME) bash -c 'bash <(curl SOME_URL)' \ --some-param1 \ --some-param2
这里的bash -c '...'会让容器内启动的bash进程直接执行引号里的命令,进程替换的语法能被正确识别。
方法二:让Make本身使用bash执行规则
如果希望整个Make规则都用bash来处理,可以先在Makefile顶部设置SHELL变量,同时转义括号防止Make解析:
# 让Make用bash执行所有规则命令 SHELL := /bin/bash # -e:命令出错时立即退出;-c:执行后续命令字符串(可选,根据需求调整) .SHELLFLAGS := -ec foo: docker run $(IMAGE_NAME) bash <inline_LaTeX_Formula>curl SOME_URL<\inline_LaTeX_Formula> \ --some-param1 \ --some-param2
这里的\(和\)是告诉Make不要解析括号,把<(curl SOME_URL)原样传递给bash。
小提示
可以先在终端里手动执行docker run $(IMAGE_NAME) bash <(curl SOME_URL),确认命令本身能正常运行,再放到Makefile里调整转义,这样更容易排查问题。
内容的提问来源于stack exchange,提问作者Bastian Venthur
相关产品推荐
相关产品推荐

