経緯
最近、apt upgrade界隈で、保留になることが多いんですよね。すでにTwitterで多く話題になっているところです。
ツイッターでの ("apt") AND ("upgrade") AND ("保留") の検索はこちら
↓こうなるんですよね、
パッケージリストを読み込んでいます...
依存関係ツリーを作成しています...
状態情報を読み取っています...
アップグレードパッケージを検出しています...
Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
libpostproc55 libavcodec58 libavutil56 libswscale5 libswresample3
libavformat58
Learn more about Ubuntu Pro at https://ubuntu.com/pro
以下のパッケージは保留されます:
alsa-ucm-conf distro-info-data gnome-settings-daemon
gnome-settings-daemon-common
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
ちょっとUbuntu Pro界隈のコメントがうるさいですが、問題となるのは、↓の部分です。
以下のパッケージは保留されます:
alsa-ucm-conf distro-info-data gnome-settings-daemon
gnome-settings-daemon-common
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
解決策としてはこの保留されたのをコピペして、
sudo apt install alsa-ucm-conf distro-info-data gnome-settings-daemon gnome-settings-daemon-common
とするだけなんですが、GUIじゃないUbuntu-Serverとかの場合、どうしているんでしょうか?
考えただけで面倒ですよね。
作成したシェルスクリプトとその解説
ってことで対応するシェルスクリプトを作ってみました。(変数名とかショボいんは許してください。)
それがこちら。
なお急ぎ足で作ったんで、保留が出ない場合=正常な場合には対応してません(エラー吐きまくります)。
この辺りは各自がリスクを判断した上で使ってください。
upgradeDame.sh
#!/bin/bash
touch upgradeDame.txt
sudo apt update
sudo apt upgrade > upgradeDame.txt
START=$( grep -ne '以下のパッケージは保留されます:' upgradeDame.txt | sed -e 's/:.*//g' )
GOAL=$( grep -ne 'アップグレード:' upgradeDame.txt | sed -e 's/:.*//g' )
START=$(($START + 1))
GOAL=$(($GOAL - 1))
INSCO=$( awk "NR==$START,NR==$GOAL {print}" upgradeDame.txt )
sudo apt install $INSCO
Renshu/bin at main · YohYasushi/Renshu · GitHubにも公開しております。
一つ一つ説明していきます。
まず、upgradeDame.sh
が存在する階層に移動しているものとして説明をすすめていきます。
/home/yohyasushi
に置いていることを想定しています。
touch upgradeDame.txt
sudo apt update
sudo apt upgrade > upgradeDame.txt
upgradeDame.txt
を作成し、sudo apt upgrade
の結果を渡しています。
ここで、
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
というエラーが出ますが、無視していいです。
なお敢えてtxt
で出力している理由は、あとから検証するためです。今回のupgradeDame.sh
ですが、盲目的にすべてinstallする仕様なので、あとから何をインストールしたか検証できるようにあえてtxt
を作りました。
それなりの危険を伴うシェルスクリプトなのも理解して使ってくださいね。
では、説明を続けていきます。
要するにコピペしたいのは↓の、
以下のパッケージは保留されます:
alsa-ucm-conf distro-info-data gnome-settings-daemon
gnome-settings-daemon-common
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
*以下のパッケージは保留されます: *と、 *アップグレード: *の間の文字列なのでそこの辺りの行番号をとってくるために、
START=$( grep -ne '以下のパッケージは保留されます:' upgradeDame.txt | sed -e 's/:.*//g' )
GOAL=$( grep -ne 'アップグレード:' upgradeDame.txt | sed -e 's/:.*//g' )
としています。変数の、$START
と$GOAL
ってますね。
でほしいのは
START=$(($START + 1))
GOAL=$(($GOAL - 1))
ですね。わかりますよね。
最後に、
INSCO=$( awk "NR==$START,NR==$GOAL {print}" upgradeDame.txt )
sudo apt install $INSCO
変数$INSCO
に、必要な部分の文字列をコピペしてから、apt install
に渡しています。
最後に、upgradeDame.txt
の中身を確認してみましょう。
パッケージリストを読み込んでいます...
依存関係ツリーを作成しています...
状態情報を読み取っています...
アップグレードパッケージを検出しています...
Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
libpostproc55 libavcodec58 libavutil56 libswscale5 libswresample3
libavformat58
Learn more about Ubuntu Pro at https://ubuntu.com/pro
以下のパッケージは保留されます:
alsa-ucm-conf distro-info-data gnome-settings-daemon
gnome-settings-daemon-common
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
こうしてあとから検証できる必要性がありますね。
まとめ
シェルスクリプト初心者の私には、けっこう苦労した作品です。有志の方々がこれをたたき台にして、もっといいものを作ってくれることも期待しております。
再度いいますが、選択的にインストールしたりは出来ないので、この点はよくよくご理解をください。では。