某些软件包默认使用最新版本,其名称中不包含版本号。例如php
$ apt-cache search php*-fpm --names-only
php-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary) (default) php7.0-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
并非所有软件包都是如此,我想运行一个 bash 函数,该函数将根据其命名约定自动选择最新的软件包。
例如,如果我想安装最新版本,oracle-java-installer
我会执行以下操作。
sudo add-apt-repository ppa:webupd8team/java -y && sudo apt-get update
aptget install oracle-java*-installer
我的 aptget 函数是这样工作的。
我有一个正则表达式,应该搜索apt-cache
并检索以下四个结果。
oracle-java7-installer - Oracle Java(TM) Development Kit (JDK) 7
oracle-java6-installer - Oracle Java(TM) Development Kit (JDK) 6
oracle-java8-installer - Oracle Java(TM) Development Kit (JDK) 8
oracle-java9-installer - Oracle Java(TM) Development Kit (JDK) 9
oracle-java9-installer
将从结果中提取并apt-get install
使用包名称运行。
我使用的正则表达式在这里工作正常正则表达式但我无法正确转义它以便它在终端中工作。
我还没有弄清楚如何从apt-cache search
结果中提取最新的包名称
function aptget(){
pkg="$2"
# versionRegex="(\d+\.)?(\d+\.)?(\d+)?"
result="${pkg/\*/$versionRegex}"
pkg_list=$(apt-cache search --names-only "^$result$")
echo $pkg_list
# pkg=
set -- "${@:1:1}" "$pkg" "${@:3}"
sudo apt-get "$@"
}
我希望帮助让正则表达式在 bash 中工作,以及有关如何仅检索最新包的名称的任何输入。
答案1
这是一个非常糟糕的主意。命名约定是为了避免破坏主要版本之间的内容。
每个发行版都需要某些主要软件的特定版本;如果您用 python3 替换 python 2.x,您的系统将变得无法使用,甚至可能无法恢复。
答案2
function apt-get-latest(){
set -- "${@:1:1}" "$(apt-cache-search-latest $2)" "${@:3}"
sudo apt-get "$@"
}
function apt-cache-search-versions(){
pkg="$1"
prefix=${pkg%\**}
suffix=${pkg#*\*}
echo "$(apt-cache search --names-only "^$prefix*" | awk '{ print $1 }' | sort | grep -P ^$prefix'(\d+\.)?(\d+\.)?(\d+|)'$suffix$)"
}
function apt-cache-search-latest(){
echo "$(apt-cache-search-versions $1 | tail -1)"
}
用法
sudo add-apt-repository ppa:webupd8team/java -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get update
apt-cache-search-versions php*-fpm
=> php5.6-fpm php7.0-fpm php7.1-fpm php-fpm
apt-cache-search-versions oracle-java*-installer
=> oracle-java6-installer oracle-java7-installer oracle-java8-installer oracle-java9-installer
apt-cache-search-latest php*-fpm
=> php-fpm
apt-cache-search-latest oracle-java*-installer
=> oracle-java9-installer
apt-get-latest install php*-fpm
apt-get-latest install oracle-java*-installer