You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:17:26