4

したがって、ここで私が意図しているのは、最新のメジャーバージョンとフルカーネルバージョンの両方の文字列を可能な限りコンパクトに(grepへの無数のパイプなしで)決定することです。

私はすでに結果にかなり満足していますが、誰かが最初の行を少しでも押しつぶす方法を知っているなら、それは非常に素晴らしいでしょう(マイナーなパッチがない場合にも機能する必要があります)。

kernel.orgのインデックスはhttp://www.kernel.org/pub/linux/kernel/v3.x/のインデックスの136kBと比較してわずか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)

猫の代わりにティーを使用します。

_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')

安いトリック:URLを短くする

_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になることはありませんが、他のバージョンが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 /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を出力します(検索文字列は1行の左側にのみ一致すると思います...最初の一致後に終了することが重要な場合は、を使用してくださいprint $2; exit

検索文字列にはスペースなどを含めることができます。パターンマッチングの代わりにawk変数とマッチングを使用すると、~ variable'... /'"$ 1"'/ ...'は一重引用符モードを終了する必要がなくなり、構文エラーが回避されます。検索文字列に「/」が含まれています。

于 2018-07-01T04:34:24.580 に答える