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

如何在deb包的preinst脚本中获取deb包所在的目录路径

deb包preinst脚本获取安装包所在目录的解决方案

问题根因

dpkg执行preinst、postinst等包维护脚本时,会主动将工作目录切换到系统根目录/,因此直接在脚本内调用pwd只能返回/,无法拿到deb包的实际存放目录。

可行实现方案

可以通过读取dpkg父进程的proc信息,无侵入式获取deb包路径,无需用户修改安装命令,具体实现代码如下,直接添加到你的preinst脚本中即可:

#!/bin/sh
set -e

# 取preinst的父进程ID,即dpkg进程的PID
DPKG_PID=$PPID
# 读取dpkg进程的命令行参数,将默认的空分隔符替换为换行符方便解析
DPKG_CMD=$(tr '\0' '\n' < /proc/${DPKG_PID}/cmdline)
# 提取命令行中后缀为.deb的参数,即安装包路径
DEB_PATH=$(echo "${DPKG_CMD}" | grep '\.deb$' | head -n 1)
# 读取dpkg进程的工作目录
DPKG_WORKDIR=$(readlink -f /proc/${DPKG_PID}/cwd)

# 拼接得到deb包的绝对路径
if echo "${DEB_PATH}" | grep -q '^/'; then
    DEB_ABS_PATH="${DEB_PATH}"
else
    DEB_ABS_PATH="${DPKG_WORKDIR}/${DEB_PATH}"
fi
# 提取deb包所在的目录路径,可直接使用该变量访问同目录下的输入文件
DEB_PARENT_DIR=$(dirname "${DEB_ABS_PATH}")

# 以下为你的业务逻辑示例,可自行修改
echo "deb包存放目录为: ${DEB_PARENT_DIR}"
cat "${DEB_PARENT_DIR}/inputfile1"

注意事项

  • 该方案依赖proc文件系统,Debian、Ubuntu等主流deb系发行版默认已挂载/proc,无需额外配置
  • 如果存在同时安装多个deb包的场景,可将grep匹配条件修改为你的包名,比如grep 'mydebpackage\.deb$',避免取错路径
  • 整个实现完全不修改用户的安装流程,用户仍可直接执行dpkg -i mydebpackage.deb完成安装

内容的提问来源于stack exchange,提问作者purushothaman poovai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:06:02