如何在RPM脚本小程序中访问命令行参数并调整冗余输出?
在RPM脚本小程序中适配冗余输出并访问命令行参数
刚好对RPM脚本这块比较熟,来给你捋清楚怎么实现需求——既要根据-v/-vv调整输出,又要能拿到完整的命令行参数,其实RPM本身就提供了现成的机制,不用自己造轮子:
一、根据verbosity级别调整输出:用内置宏%{?_verbose}
RPM会自动根据你执行命令时的-v/-vv参数,设置对应的宏变量,直接用这个宏判断就够了:
- 执行
rpm -v ...时,%{?_verbose}的值为1 - 执行
rpm -vv ...时,%{?_verbose}的值为2 - 没加
-v系列参数的话,这个宏不会被定义(为空)
在spec文件的脚本段(比如%post、%pre)里可以直接这么用:
%post # 控制输出详细程度 if [ "%{?_verbose}" = "2" ]; then echo "[DEBUG] 这是只有-vv才会显示的详细调试日志" # 这里可以放更细粒度的调试操作,比如打印文件路径、变量值 elif [ "%{?_verbose}" = "1" ]; then echo "[INFO] 这是-v参数对应的普通冗余信息" else echo "默认输出,所有场景都会显示" fi
二、访问完整的RPM命令行参数:读取RPM_COMMAND_LINE环境变量
RPM会把你执行时的完整命令行(包括所有参数、包名)放到RPM_COMMAND_LINE环境变量里,不管是spec里的脚本还是被RPM调用的独立小程序,都能直接读取这个变量。
举个例子:
%preun echo "当前执行的RPM命令:$RPM_COMMAND_LINE" # 也可以自己解析参数,比如检查是否包含某个选项 if echo "$RPM_COMMAND_LINE" | grep -q "--nodeps"; then echo "检测到了--nodeps参数,跳过依赖检查逻辑" fi
如果是独立的脚本小程序(不是写在spec里的),要获取%{?_verbose}宏的话,可以用rpm --eval命令来解析:
#!/bin/bash # 从RPM宏中获取verbosity级别 VERBOSE=$(rpm --eval "%{?_verbose}") if [ "$VERBOSE" = "2" ]; then echo "小程序收到-vv参数,开启全量日志" fi
小提示
- 优先用
%{?_verbose}宏来判断verbosity,比自己解析命令行更可靠,因为它直接对应RPM内部的日志级别,不会因为参数顺序、缩写写法(比如-v和--verbose)出问题 RPM_COMMAND_LINE包含了完整的命令上下文,适合需要做复杂参数判断的场景,但日常调输出用宏就足够了
内容的提问来源于stack exchange,提问作者user3071170
相关产品推荐
相关产品推荐

