rcmdnk's blog

GNUソフトウェアプログラミング -オープンソース開発の原点

GNU Projectで開発されているBashやGNU Screen等の 最新バージョンを取得するコマンドの紹介。

GNU Projectパッケージの最新バージョンを取得するワンライナーコマンド

$ pac=screen && curl "http://ftp.gnu.org/gnu/$pac/?C=M;O=A" 2>/dev/null|grep $pac|grep ".tar.gz<"|grep "$1"|grep -v "\-doc\-"|grep -v latest|tail -n1|sed 's/<[^>]*>/ /g'|awk -v pac=$pac '{sub(pac"-", "", $1)}{sub(".tar.gz", "", $1)}{print pac " " $1 "    updated at: " $2 " " $3}'
screen 4.5.1    updated at: 2017-02-25 10:51
$ pac=bash && curl "http://ftp.gnu.org/gnu/$pac/?C=M;O=A" 2>/dev/null|grep $pac|grep ".tar.gz<"|grep "$1"|grep -v "\-doc\-"|grep -v latest|tail -n1|sed 's/<[^>]*>/ /g'|awk -v pac=$pac '{sub(pac"-", "", $1)}{sub(".tar.gz", "", $1)}{print pac " " $1 "    updated at: " $2 " " $3}'
bash 4.4    updated at: 2016-09-15 10:47
$ pac=autoconf && curl "http://ftp.gnu.org/gnu/$pac/?C=M;O=A" 2>/dev/null|grep $pac|grep ".tar.gz<"|grep "$1"|grep -v "\-doc\-"|grep -v latest|tail -n1|sed 's/<[^>]*>/ /g'|awk -v pac=$pac '{sub(pac"-", "", $1)}{sub(".tar.gz", "", $1)}{print pac " " $1 "    updated at: " $2 " " $3}'
autoconf 2.69    updated at: 2012-04-24 23:17

こんな感じで最初のpac=の所でパッケージ名を指定すると そのパッケージの最新バージョンとアップデートの日時を取ってこれます。

シェルスクリプト版

まあワンライナーと言い切るにはちょっと長いので、真面目にスクリプトにするとこんなことをやっています。

get_latest_gnu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env bash

pac=$1

# GNU project distribution url.
# Sorted by Clumn=Modified, Order=Ascending
url="http://ftp.gnu.org/gnu/$pac/?C=M;O=A"

# Get package page's html
html="$(curl "$url" 2>/dev/null)"

# Get the latest modified tar.gz file line, remove "-doc-" or "latest" names.
latest=$(printf "$html"|grep $pac|grep ".tar.gz<"|grep "$1"|grep -v "\-doc\-"|grep -v latest|tail -n1)

# Remove html tags
params=$(echo $latest|sed 's/<[^>]*>/ /g')

# Print <package> <version> Updated at: <date> <time>
echo $params|awk -v pac=$pac '{sub(pac"-", "", $1)}{sub(".tar.gz", "", $1)}{print pac " " $1 "    updated at: " $2 " " $3}'

これで上のと同様に

$ get_latest_gnu screen
screen 4.5.1    updated at: 2017-02-25 10:51

みたいな感じで最新バージョンの情報が取ってこれます。

各パッケージの配布ページにtar.gzファイルがバージョン名付きであって、 その更新日時を見て一番新しいものを取ってきているだけです。

readline

readlineに関してはBashと共に開発が進められていて 配布ディレクトリもbashと同じになっています。

Index of /gnu/bash

なので、

$ pac=readline && curl "http://ftp.gnu.org/gnu/bash/?C=M;O=A" 2>/dev/null|grep $pac|grep ".tar.gz<"|grep "$1"|grep -v "\-doc\-"|grep -v latest|tail -n1|sed 's/<[^>]*>/ /g'|awk -v pac=$pac '{sub(pac"-", "", $1)}{sub(".tar.gz", "", $1)}{print pac " " $1 "    updated at: " $2 " " $3}'
readline 7.0-rc2    updated at: 2016-08-22 11:27

みたいな感じで最初のURL指定の所で$pacbashに書き換えて上げる必要があります。

他にもあるかもしれませんが、まあ大体こんな感じで。

まとめ

多分、探せばGNUパッケージの最新バージョン一覧とか、 簡単に指定のパッケージのバージョンを引き出せるページとかありそうなもんですが、 少なくとも公式には無さそうだったのでさくっとやるとこんな感じでやってみました。

Sponsored Links
Sponsored Links

« Cygwin(Bash/Zsh)からPowerShellスクリプトを直接実行するbashrc/zshrc設定 Gmailで最初からラベルを全て展開して表示する設定 »

}