M4 在字符串中看到文件结尾

M4 sees end of file in string

我收到一个 m4 解析错误,它在以下一组行的第 2 行中看到一个 EOF 字符(将在单独的 shell:

中执行)
     "set V1 = `grep -c  'z = 10\.0e-6'     qt_data/kxfo_ssr_udfo_tmp/* | wc -l`;\
      set V2 = `grep -c  'z = -30\.0e-6'    qt_data/kxfo_ssr_udfo_tmp/* | wc -l`;\
      test $V1 > 0;\
      test $V1 = $V2 "

我得到的错误是:<path-to-file>:<line>:ERROR: end of file in string

(为清楚起见:给出问题的行是:set V2 = `grep -c 'z = -30\.0e-6' qt_data/kxfo_ssr_udfo_tmp/* | wc -l`;\

我试图找出 M4 可以看到哪些字符组合以及如何将其转义为 EOF,因为该命令本身在 shell.

中可以正常工作

有谁知道我该如何解决这个错误,因为我找不到被 M4 视为 EOF 的字符组合?

一个不理想但可行的解决方案可能是使用 changequote built-in 宏:

  1. 选择一个 non-existent 字符作为起始引号,选择一个结束字符作为结束引号。例如:changequote("""", """);在这里,你对 m4 解释器说 """" 是开始引号,""" 是结束引号,从现在开始直到解释器找到宏 changequote().

  2. 要扭转这种行为(意思是,从您不再希望这种假设的地方回到引号的标准定义),您需要使用 built-in 宏 changequote() 没有参数。

默认情况下,重音符和重音符是左右引号字符串。这会阻止识别特殊字符。它也被视为单个标记(带引号的字符串),其值是引号之间的文本,其中一层引号被剥离。

引号字符可以嵌套,但必须平衡。

 $ m4 test.m4
 define(`foo', `This is macro `foo'.')dnl
 foo
 => This is macro foo.

在您的情况下,反引号不是 M4 左引号字符串,而是必须由 shell(命令替换)专门解释的字符。换句话说,默认的左引号字符串会干扰最终文本。

changequote(`[',`]')dnl
nb_files=`find . -type f | wc -l`; echo $nb_files
changequote`'dnl

注意: 您应该使用 changequote 来恢复默认的引号字符串,因为 changequote() 未指定(c.f。POSIX规格)。

注意:更改引号字符串时应小心(例如,见下文)。

$ m4 test2.m4
divert(`-1')
changequote(`[',`]')
define([foo], [syscmd(false)ifelse(sysval,[0],,
                                  [m4exit([1])])])
changequote
divert`'dnl
foo
error-> m4:foo.m4:7: non-numeric argument to builtin `m4exit'