我不清楚错误从何而来,Makefile代码如下:
platform_id = $$( uname -s )
platform = $$( \
case $(platform_id) in \
Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
* ) echo Unrecognized ;; \
esac )
Makefile 中的第一个目标是:
check:
echo $(platform); echo
在 Linux Mint 19.0 和 FreeBSD 11.2 上,它都可以毫无问题地运行,并且经过 GNUmake
和 BSD测试make
。我的意思是在这两个系统上都有gmake
, 和bmake
。
我是 OpenBSD 6.4 的新手,无法找到错误原因令人沮丧。
该命令的错误消息如下:
echo $( case $( uname -s ) in Linux | FreeBSD | OpenBSD | NetBSD ) echo $( uname -s ) ;; * ) echo Unrecognized ;; esac ); echo
/bin/sh: syntax error: ';;' unexpected
*** Error 1 in /root (Makefile:47 'check')
由于我还没有安装访客添加项,所以我必须进行转录,但检查了两次,它应该是正确的。
答案1
您使用的 shell 解析器已损坏......
背景:解析$(command)
需要递归解析器才能正常工作。
请注意,完整的表达式$(command)
需要位于单个字符串中,并且command
可能非常复杂。为了找到命令的结尾,现代 shell 递归地调用解析器并让它停在第一个多余的)
.mksh
然后bosh
将二进制语法树转换回命令,同时将ksh93
递归解析器读取的字符打乱到缓冲区中。
POSIX(实际上是 ksh88)有时相信这可以与一个简单的字符串解析器一起使用,该解析器只是计数 (
并添加了在 case 标签之前)
添加的要求 。(
由于您的命令与 POSIX 认为的内容不符,您可以通过更改重试:
Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
进入:
( Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
和
* ) echo Unrecognized ;; \
进入
( * ) echo Unrecognized ;; \
如果您的 shell 使用这样的原始计数解析器,它应该可以适应该更改。