R包configure文件bashism问题:是否需修改及最佳实践咨询
问题解答
能不能忽略这个软警告?
可以暂时忽略,但不推荐。这个警告是因为command -v属于bash扩展语法,并非POSIX标准shell规范。虽然多数系统的/bin/sh会兼容bash语法,但在严格遵循POSIX的环境(比如以dash作为/bin/sh的Linux发行版)中,这段代码可能执行出错。如果你的R包要提交到CRAN,其检查环境对兼容性要求更严格,这类bashism可能导致构建失败,因此建议修复。
改写为POSIX兼容的代码
将command -v替换为POSIX标准写法,同时优化代码的鲁棒性:
# Extra checks on MacOS for SSL support in libpq if [ "$(uname)" = "Darwin" ] && command -p pkg-config >/dev/null 2>&1; then if pkg-config --atleast-version=12 libpq; then case "$(pkg-config --libs --static libpq)" in *crypto*) echo "Local libpq has SSL support" ;; *) echo "Local libpq does not have SSL support" FORCE_AUTOBREW=1 ;; esac else FORCE_AUTOBREW=1 fi fi
关键修改点:
- 用
command -p pkg-config >/dev/null 2>&1替代[command -v pkg-config]:command -p是POSIX标准选项,会优先从系统PATH的标准位置查找命令;重定向输出到/dev/null是为了仅检查命令是否存在,不输出冗余结果。 - 把反引号
`替换为$():两者均符合POSIX规范,但$()可读性更强,支持嵌套写法,是现代shell脚本的首选。 - 给
$(uname)和$(pkg-config ...)的结果加双引号:避免结果包含空格时,导致[命令解析出错。
编写configure脚本的最佳实践
- 严格遵循POSIX shell规范:configure脚本默认由
/bin/sh执行,不要依赖bash特有语法(比如[[ ]]、数组、command -v等)。 - 检查命令存在的标准方式:使用
command -p cmd >/dev/null 2>&1或type cmd >/dev/null 2>&1,这两种写法均符合POSIX标准。 - 变量引用必加双引号:防止变量值包含空格、通配符等特殊字符时,引发脚本执行错误。
- 多环境测试:在不同系统(比如Ubuntu用dash、macOS用zsh/bash)下测试脚本,确保兼容性。
- 参考CRAN官方规则:CRAN对configure脚本的兼容性有明确要求,编写前可参考CRAN Package Policies中的相关内容。
内容的提问来源于stack exchange,提问作者pachadotdev
相关产品推荐
相关产品推荐

