GNU shell 函数在意外标记 `(' 附近出现语法错误

syntax error near unexpected token `(' with GNU shell function

我想在我的 makefile 中确定 Intel Fort运行 编译器的版本,所以我使用 GNU shell 函数添加了一些脚本,如下所示用于测试,

VERIFORT := $(shell ifort --version)
#VERIFORT := $(shell ifort --version | grep ^ifort) # error occurred too

.PHONY: test
test:
    echo $(VERIFORT)

如果您复制上面显示的那些代码行,请确保在 echo 命令之前有一个制表符。

这给了我一些错误

/bin/sh: -c: line 0: syntax error near unexpected token `('

当我在终端中运行命令ifort --versionifort --version | grep ^ifort时,它给出了正确的结果并且没有发生错误。

我的系统:64位CentOS 7

感谢任何更正建议。

[编辑]

添加更多输出细节:

使用 grep 版本的 VERIFORTmake 命令产生以下结果,

echo ifort (IFORT) 18.0.2 20180210
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `echo ifort (IFORT) 18.0.2 20180210'
make: *** [test] Error 1

[已解决]

原来是@MadScientist

提到的echo使用问题

I think you need to quote the value of the VERIFORT variable when you print it, so that the shell doesn't interpret special characters.

引用 VERIFORT 变量产生了以下结果(grep 版本)

echo 'ifort (IFORT) 18.0.2 20180210'
ifort (IFORT) 18.0.2 20180210

并且没有发生错误。

我也在终端echo中测试了它

echo ifort (IFORT) 18.0.2 20180210

产生了同样的错误

bash: syntax error near unexpected token `('

您似乎没有显示 make 命令的完整输出。我认为在此错误消息之前,make 打印了一个 echo 行(除非您向我们展示的 makefile 实际上不是您调用的内容,并且您的实际 makefile 在 echo 之前添加了一个 @ 。 .. 在这种情况下,您应该在调试时将其删除)。如果您向我们展示了那个输出是什么,那么问题是什么会更清楚。此外,当您从命令行 运行 时,您没有显示 ifort --version 命令的输出是什么,但我认为它可能包含括号。

我认为您需要在打印时引用 VERIFORT 变量的值,这样 shell 就不会解释任何特殊字符:

test:
        echo '$(VERIFORT)'