RPM安装阶段获取自身路径及读取同目录文件的技术咨询
解决RPM %pre阶段读取同目录argument.txt的问题
我明白你的困扰——RPM安装过程中,%pre脚本运行在根目录环境下,$PWD返回/,而%(pwd)是构建RPM时的路径,完全和部署时的目录不沾边,确实没法直接拿到当前RPM所在的目录。
不过我们可以通过提取rpm进程的命令行参数来间接获取RPM文件的路径,进而找到同目录的argument.txt,具体实现如下:
具体脚本示例
在你的spec文件的%pre段中添加以下代码:
# 获取当前rpm进程的命令行,提取其中的.rpm文件路径 RPM_FULL_PATH=$(ps -p $$ -o cmd= | grep -oP '\S+\.rpm') if [ -z "$RPM_FULL_PATH" ]; then echo "Error: 无法获取当前安装的RPM文件路径" >&2 exit 1 fi # 提取RPM文件所在的目录 RPM_DIR=$(dirname "$RPM_FULL_PATH") ARGUMENT_FILE="$RPM_DIR/argument.txt" if [ ! -f "$ARGUMENT_FILE" ]; then echo "Error: 未在RPM目录($RPM_DIR)找到argument.txt文件" >&2 exit 1 fi # 这里可以添加你需要的逻辑,比如读取文件内容 ARG_CONTENT=$(cat "$ARGUMENT_FILE") echo "成功读取argument.txt内容: $ARG_CONTENT"
原理说明
ps -p $$ -o cmd=:获取当前运行%pre脚本的rpm进程的完整命令行($$是当前脚本的PID,也就是rpm进程的PID)grep -oP '\S+\.rpm':从命令行中匹配出完整的RPM文件路径(\S+匹配非空白字符,确保拿到完整路径)- 用
dirname提取路径的目录部分,就能得到和RPM同目录的路径了
注意事项
这个方法有个前提:用户必须通过直接执行rpm命令安装本地RPM文件(比如rpm -i ./A.rpm或者rpm -i /path/to/A.rpm)。如果用户用yum/dnf安装,RPM文件会被下载到系统缓存目录(比如/var/cache/dnf/下的子目录),这时候你的argument.txt如果不在缓存目录里,脚本就会报错。
如果你的场景允许,另一个备选方案是把argument.txt打包进RPM的某个固定目录(比如/opt/your-app/),这样在%pre里直接用固定路径读取就行,但这可能不符合你“和RPM同目录”的需求,所以仅作为补充思路。
内容的提问来源于stack exchange,提问作者Omer Dagan
相关产品推荐
相关产品推荐

