【问题标题】:Missing right parenthesis in shell command?shell命令中缺少右括号?
【发布时间】:2015-07-25 07:50:21
【问题描述】:

我正在尝试向我的 makefile 添加一条警告消息。 Make 无法找到右括号。

以下内容来自我的 GNUmakefile:

341  ALIGNED_ACCESS = $(shell cat config.h | $(EGREP) -c "^#define NO_UNALIGNED_DATA_ACCESS")
342  ifeq ($(ALIGNED_ACCESS),0)
343  $(info WARNING: NO_UNALIGNED_DATA_ACCESS is not defined in config.h)
344  endif

投诉:

$ make
GNUmakefile:341: *** unterminated call to function 'shell': missing ')'.  Stop.

我确实在 makefile 中另外输出了 25 次,所以我不确定为什么它无法为上面的 shell 找到正确的括号。

我还将命令移到第 1 行进行测试,我得到了相同的消息(以行号更改为模)。为了好玩,我添加了一个不平衡的右括号,但我得到了同样的信息。

为什么make找不到合适的括号?

如何强制 make 执行命令?

【问题讨论】:

  • 顺便说一句,将EGREP 放在变量中似乎是错误的。
  • @tripleee - 我们将egrep 放在一个变量中,以便用户可以在egrep 未按预期执行时覆盖它。你有什么推荐的?
  • 首先,如果性能是一个问题,请放弃useless cat。无论如何,我很难想象egrep 处理几千个 C 源文件的速度太慢,或者普通用户能够设计出更快的替代方案。
  • @triplee - “如果性能是一个问题......” - 不,性能不是问题。关于cat 的好点...我从没想过。但是egrep呢?
  • 那么“未按预期执行”是什么意思? grep -E 应该足够便携,除非你的目标是明显的 pre-POSIX 平台。

标签: shell makefile gnu-make cat


【解决方案1】:

您必须转义 makefile 中的 #,因为这会开始注释...

ALIGNED_ACCESS = $(shell cat config.h | $(EGREP) -c "^\#define NO_UNALIGNED_DATA_ACCESS")

注意“#”前的“\”

【讨论】:

  • 确实,就是这样......我虽然可能是这样,所以我尝试使用单引号和双引号......但我没有想过要尝试逃避它。
  • 坦率地说,答案也许应该特别提到反斜杠,和/或展示一个例子。使用 UUCA 修复,尝试$(shell grep -Ec "^\#define NO_UNALIGNED_DATA_ACCESS" config.h)
  • 拯救了我的一天。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2018-04-10
  • 1970-01-01
相关资源
最近更新 更多