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 宏:
选择一个 non-existent 字符作为起始引号,选择一个结束字符作为结束引号。例如:changequote("""", """)
;在这里,你对 m4 解释器说 """"
是开始引号,"""
是结束引号,从现在开始直到解释器找到宏 changequote()
.
要扭转这种行为(意思是,从您不再希望这种假设的地方回到引号的标准定义),您需要使用 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'
我收到一个 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 宏:
选择一个 non-existent 字符作为起始引号,选择一个结束字符作为结束引号。例如:
changequote("""", """)
;在这里,你对 m4 解释器说""""
是开始引号,"""
是结束引号,从现在开始直到解释器找到宏changequote()
.要扭转这种行为(意思是,从您不再希望这种假设的地方回到引号的标准定义),您需要使用 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'