最近の、"apt upgrade"での"保留"に対するシェルスクリプト

# 経緯

最近、*apt upgrade*界隈で、**保留**になることが多いんですよね。すでに*Twitter*で多く話題になっているところです。

[ツイッターでの ("apt") AND ("upgrade") AND ("保留") の検索はこちら](https://twitter.com/search?q=(%22apt%22)%20AND%20(%22upgrade%22)%20AND%20(%22%E4%BF%9D%E7%95%99%22)&src=typed_query&f=live)

↓こうなるんですよね、

```
パッケージリストを読み込んでいます...
依存関係ツリーを作成しています...
状態情報を読み取っています...
アップグレードパッケージを検出しています...
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](https://github.com/YohYasushi/Renshu/tree/main/bin)にも公開しております。


一つ一つ説明していきます。

まず、`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 個。
```

こうしてあとから検証できる必要性がありますね。


# まとめ

シェルスクリプト初心者の私には、けっこう苦労した作品です。有志の方々がこれをたたき台にして、もっといいものを作ってくれることも期待しております。

再度いいますが、選択的にインストールしたりは出来ないので、この点はよくよくご理解をください。では。


# 関連するリンク

[Renshu/bin at main · YohYasushi/Renshu · GitHub](https://github.com/YohYasushi/Renshu/tree/main/bin)