验证POSIX Shell脚本配置文件加载逻辑的正确性
POSIX Shell脚本配置文件加载流程的正确性验证
背景
我正在编写符合POSIX标准的Shell脚本(使用ShellCheck校验、Dash shell测试),此前一直通过脚本顶部的变量做配置,但用户更偏好独立配置文件而非直接修改脚本。我已编写脚本myScript及同目录的myScript.conf,现验证该配置加载流程在多种场景下的正确性,以下是最小代码片段:
myScript.conf
var1=stringA var2=stringB
myScript
#!/bin/sh error() { printf >&2 '%s ' "$@" exit 1 } script_dir=$( dirname "$0" ) config_file="$script_dir"/myScript.conf if [ ! -f "$config_file" ]; then error "The configuration file does not exist or it is not a regular file." fi if [ ! -r "$config_file" ]; then error "The configuration file exists, but it is not readable by this script." fi . "$config_file" # # DO SOME GOOD STUFF BASED ON CONFIG VARIABLES #
场景正确性分析
正常场景
当配置文件存在且为可读的普通文件时,脚本通过dirname "$0"定位到脚本所在目录,正确找到同目录下的myScript.conf,再通过.命令将配置文件中的变量导入当前Shell环境,后续业务逻辑可正常使用var1、var2等配置变量,流程完全符合预期。
异常场景
- 配置文件不存在/非普通文件:脚本通过
[ ! -f "$config_file" ]检测到该情况,调用error函数输出错误信息并退出,错误处理逻辑有效。 - 配置文件存在但不可读:
[ ! -r "$config_file" ]会识别权限问题,同样触发错误退出,符合权限校验的预期。
潜在问题与优化建议
- 脚本目录定位的鲁棒性:
dirname "$0"在部分场景下可能返回相对路径(如脚本通过PATH全局调用时),建议改为script_dir=$(cd "$(dirname "$0")" && pwd),确保获取脚本的绝对路径,避免跨目录调用时的路径错误。 - 配置文件安全性:直接通过
.加载配置文件时,若文件被篡改包含恶意Shell命令(如var1=$(rm -rf /)),脚本会直接执行该命令。可通过限制配置文件权限(如仅所有者可写),或在加载前过滤内容(仅保留var=value格式的行)来降低风险。 - 变量冲突与缺失检查:若脚本自身已定义同名变量,配置文件的变量会覆盖原有值;若配置文件未定义必要变量,后续逻辑可能出错。建议在加载后添加必要变量的存在性检查,例如:
[ -z "$var1" ] && error "Required variable var1 is not set in config file"
内容的提问来源于stack exchange,提问作者Vlastimil Burián
相关产品推荐
相关产品推荐

