4

所以我打算在这里做的是尽可能紧凑地确定最新的主要版本和完整的内核版本字符串(没有无数管道到 grep)。

我已经对结果非常满意,但是如果有人知道如何压缩第一行,即使是最轻微的,它也会非常棒(当没有小补丁时它也必须工作)。

与http://www.kernel.org/pub/linux/kernel/v3.x/的 136kB 相比,kernel.org 的索引只有 36kB,这就是我使用它的原因:

_major=$(curl -s http://www.kernel.org/ -o /tmp/kernel && cat /tmp/kernel | grep -A1 mainline | tail -1 | cut -d ">" -f3 | cut -d "<" -f1) 
pkgver=${_major}.$(cat /tmp/kernel | grep ${_major} | head -1 | cut -d "." -f6)
4

4 回答 4

3

这只是现阶段的一个思考练习,因为真正的答案在上面的评论中,但这里有一些可能的改进。

原来的:

_major=$(curl -s http://www.kernel.org/ -o /tmp/kernel && cat /tmp/kernel | grep -A1 mainline | tail -1 | cut -d ">" -f3 | cut -d "<" -f1)

使用 tee 代替 cat:

_major=$(curl -s http://www.kernel.org/ | tee /tmp/kernel | grep -A1 mainline | tail -1 | cut -d ">" -f3 | cut -d "<" -f1)

使用 sed 最小化管道数量,并使命令不可读

_major=$(curl -s http://www.kernel.org/ | tee /tmp/kernel | sed -n '/ainl/,/<\/s/ s|.*>\([0-9\.]*\)</st.*|\1|p')

便宜的技巧:缩短网址

_major=$(curl -s kernel.org | tee /tmp/kernel | sed -n '/ainl/,/<\/s/ s|.*>\([0-9\.]*\)</st.*|\1|p')
于 2013-01-15T14:30:01.680 回答
3

kernel.org 在https://www.kernel.org/finger_banner提供了所有当前版本的明文列表

对于主线:

curl -s https://www.kernel.org/finger_banner | grep mainline | awk '{print $NF}'

对于最新的稳定:

curl -s https://www.kernel.org/finger_banner | grep -m1 stable | awk '{print $NF}'

主线和最新的稳定版本永远不会 EOL,但其他版本通常是,因此上述 awk 命令不会对所有版本都正常工作。作为 bash 函数的一般解决方案:

latest_kernel() {
    curl -s https://www.kernel.org/finger_banner | grep -m1 $1 | sed -r 's/^.+: +([^ ]+)( .+)?$/\1/'
}

例子:

$ latest_kernel mainline
4.18-rc2
$ latest_kernel stable
4.17.3
$ latest_kernel 4.16
4.16.18
于 2018-06-27T18:08:26.870 回答
1

你有一个无用的 cat。您可以更换:

cat /tmp/kernel | grep -A1 mainline

简单地说:

grep -A1 mainline /tmp/kernel

就您而言,您甚至根本不需要该文件。Curl 默认会发送到标准输出,所以你可以这样做:

curl -s http://www.kernel.org/ | grep -A1 mainline
于 2013-01-15T14:42:44.927 回答
0

扩展@Justin Brewer 的答案,您可能想知道内核何时 EOL,因为这是有用的信息……以下单个 awk 命令为您保留所有这些信息。

latest_kernel() {
    curl -s https://www.kernel.org/finger_banner |awk -F ':' -v search="$1" '{if ($1 ~ search) {gsub(/^[ ]+/, "", $2); print $2}}'
}
  • -F ':' -- 字段分隔符,因为 : 之后的所有内容都是版本字符串。
  • -v search="$1" -- 将搜索字符串作为 awk 内部变量传递
  • if 语句 -- 检查字段 $1 是否与搜索字符串匹配
  • gsub -- 就地修改字段 $2 以去除前导空格

然后只需为任何匹配的记录打印字段 $2 (我假设您的搜索字符串只会匹配一行的左侧......如果在第一次匹配后退出很重要,请使用print $2; exit

搜索字符串可以包含空格等。使用 awk 变量和匹配~ variable而不是模式匹配 '.../'"$1"'/...' 避免了退出单引号模式的需要并避免语法错误,其中搜索字符串包含“/”。

于 2018-07-01T04:34:24.580 回答