You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile中bash <(curl ...)组合的括号转义问题

解决Makefile中bash进程替换的括号转义问题

这个错误的根源其实有两个,咱们一步步拆解:

  1. Make默认用/bin/sh而非bash:<(curl SOME_URL)是Bash专属的进程替换特性,POSIX标准的/bin/sh并不支持这个语法,所以直接执行会触发语法错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:17:49