我想编写一个脚本来在安装 opkg 包之前检查它的版本。
我做了很多研究,在 dpkg 系统上找到了一些答案,但在 opkg 系统上没有找到答案。
我已经尝试过opkg info
,opkg status
但opkg list
它们似乎都适用于已安装的软件包,但不适用于.opk
文件。
我可以通过某种方式获取信息,opkg install file.opk --noaction
但速度非常慢,并且输出可能很难可靠地解析,因为测试安装可能会因各种不同原因而失败。
并且opkg compare-versions
只比较字符串所以没有解决方案。
更新:
我对此想得更多。
opk 包基本上是一个.tar.gz
文件,版本号存储在其中的一个文本文件中(在文件中CONTROL/control
)。
所以要从包中获取版本信息,就不可避免地需要解压,所以需要花费一些时间。
虽然快速的解决方案是将版本号作为包的文件名的一部分然后解析该名称,但文件名可以很容易地更改。
我的计划是使用两遍方法:1)将版本号作为包名称的一部分,并解析包名称以获得“不太可信”的版本号; 2)如果看起来不错,则进行“试运行”安装以获取文件中的真实版本号CONTROL/control
。如果也很好,则继续进行实际安装。
这种方法的问题之一是,它实际上使实际安装的时间加倍:在实际安装运行之前,首先要运行一次试运行,这需要相同的时间。
更新2:
上面的更新并不完全正确,因为 opk 是一个ar
包含两个文件的存档debian-binary
control.tar.gz
data.tar.gz
,并且版本信息位于control.tar.gz
.
因此可以快速提取control.tar.gz
fromopk
然后提取control
from control.tar.gz
,然后从那里获取版本号。
答案1
#!/bin/sh
# command that checks opk version number
#set -e
VERSION=3
version ()
{
echo
echo "`basename $1` version $VERSION"
echo "command that checks opk version number"
echo
exit 0
}
usage ()
{
echo "
Usage: `basename $1` <options> [ files for install partition ]
Mandatory options:
--opk_file file name (e.g ./my_package.opk)
Optional options:
--version Print version.
"
exit 1
}
# Process command line...
while [ $# -gt 0 ]; do
case $1 in
--help | -h)
usage $0
;;
--opk_file) shift; opk_file=$1; shift; ;;
--version) version $0;;
*) copy="$copy $1"; shift; ;;
esac
done
test -z $opk_file && usage $0
###########################
end parsing command line
###########################
ar -x $opk_file control.tar.gz #extract control.tar.gz from .opk
tar -zxvf control.tar.gz ./control > /dev/null 2>&1
# extract control file from control.tar.gz, silent stderr/stdout
cat control |grep Version | sed -e "s/Version:\s*\(\d*\)\D*/\1/"
# grep Version keyword and remove it
rm control
rm control.tar.gz
# clean up
用法:
opkversion.sh --opk_file ./mypackage.opk
示例输出:
9999
调整sed
命令可以改变命令的过滤策略(opk包的版本号可能非常复杂)。