-Wextra在shell中执行正常但在bash脚本中提示命令未找到
问题产生原因
你的脚本存在两处语法错误,共同触发了这个报错:
- 带空格的变量赋值未加引号
bash变量赋值规则要求,等号右侧的值如果包含空格,必须用单/双引号整体包裹,否则shell会把空格后的内容识别为独立要执行的命令。你写的CFLAGS=-Wall -Wextra -pedantic本质是临时给环境变量CFLAGS赋值为-Wall,之后尝试执行-Wextra命令、传入参数-pedantic,完全不符合给CFLAGS赋多参数值的预期。 - 错误使用命令替换包裹执行命令
最后一行外层的$()是bash的命令替换语法,它的执行逻辑是先运行括号内的命令、捕获命令的标准输出,再把输出内容作为新的shell命令二次解析执行。你在交互式shell中是直接运行编译命令,没有这层多余的包裹,所以不会触发二次解析;而脚本中套了$()之后,拆分出来的-Wextra参数被二次解析为要执行的命令,最终抛出-Wextra: command not found错误。
修复方案
去掉编译命令外层多余的命令替换结构,同时给带空格的变量赋值加上引号,变量引用时也建议加双引号避免异常的单词拆分、通配符展开问题。修正后的可直接运行的脚本如下:
CC="mpicc" CFLAGS="-Wall -Wextra -pedantic" CFILE="PerfTestMM.c" EXE="ptmm" "$CC" $CFLAGS -o "$EXE" "$CFILE" -lblas
如果需要更严谨地处理包含空格的编译参数(比如后续添加带空格的头文件搜索路径、库路径),可以把编译参数定义为bash数组,彻底避免参数解析问题,写法如下:
CC="mpicc" CFLAGS=("-Wall" "-Wextra" "-pedantic") CFILE="PerfTestMM.c" EXE="ptmm" "$CC" "${CFLAGS[@]}" -o "$EXE" "$CFILE" -lblas
内容的提问来源于stack exchange,提问作者Enzo Basile
相关产品推荐
相关产品推荐

