Aptからアップグレード可能なパッケージの数を出力するスクリプトを記述しようとしています。ただし、この警告も表示され続けます。
# Sudo apt update | grep packages | cut -d '.' -f 1
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
All packages are up to date
私はそれを単に出力したいです:
All packages are up to date
または
35 packages can be updated
その警告を無効にする方法はありますか?この返された文字列といくつかの追加情報をcronジョブからのDiscord通知で使用すると、出力がかなり邪魔になります。
私はすでにこれらを見ましたが、どれも私のために働いていませんでした:
https://unix.stackexchange.com/questions/19470/list-available-updates-but-do-not-install-them
https://askubuntu.com/questions/269606/apt-get-count-the-number-of-updates-available
まず、非表示にしようとしている警告の意味を検討してください。理論的には、apt
は明日、「パッケージ」ではなく「ディストリビューション」と呼ぶように変更される可能性があり(「安定したCLIインターフェースがまだない」ため)、これは完全にパイプラインを破壊します。より可能性の高い変更は、Wordの「パッケージ」を複数の場所で使用するもので、探しているパッケージ数だけではなく、パイプラインが無関係な情報を返す原因になります。
しかし、あなたはおそらくそれについてあまり心配していませんし、現実的には、あなたがそうあるべき理由はありません。インターフェイスは長年安定しており、おそらくすぐには変更されません。では、どのようにしてその警告を消すのですか?
* nixの世界では、コマンドラインへの出力は通常、stdout(標準出力)とstderr(標準エラー)の2つのフレーバーです。正常に動作するプログラムは、標準出力をstdoutに送信し、警告またはエラーメッセージをstderrに送信します。したがって、エラー/警告を消したい場合は、通常、出力リダイレクト2>/dev/null
を使用してstderrにメッセージを破棄することでこれを実現できます。 (英語では、「2番目の出力チャネル(>
、stderrです)(2
)を/dev/null
(そこに送信されたすべてを破棄するだけです)にリダイレクトします」。
したがって、答えは次のとおりです。
$ Sudo apt update 2>/dev/null | grep packages | cut -d '.' -f 1
4 packages can be upgraded
補足:質問では、コマンドは# Sudo apt...
として表示されます。 #
シェルプロンプトは、そのコマンドを使用するときに、おそらくrootとしてログインしたことを意味します。すでにrootである場合は、Sudo
を使用する必要はありません。
無視する警告の詳細(man apt
から):
SCRIPT USAGE
The apt(8) commandline is designed as a end-user tool and it may change
the output between versions. While it tries to not break backward
compatibility there is no guarantee for it either. All features of
apt(8) are available in apt-cache(8) and apt-get(8) via APT options.
Please prefer using these commands in your scripts.
次のコマンドで代替を使用できます
Sudo apt-get -s upgrade | grep -P "\d\K upgraded"
出力は次のようになります
6 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
-s
は、シミュレーション、調整、または予行演習を意味します
から apt-get
manページ
-s, --simulate, --just-print, --dry-run, --recon, --no-act
No action; perform a simulation of events that would occur based on
the current system state but do not actually change the system.
Locking will be disabled (Debug::NoLocking) so the system state
could change while apt-get is running. Simulations can also be
executed by non-root users which might not have read access to all
apt configuration distorting the simulation. A notice expressing
this warning is also shown by default for non-root users
(APT::Get::Show-User-Simulation-Note). Configuration Item:
APT::Get::Simulate.
この回答はこれに触発されたものです blog
単純にエラーを/ dev/nullにパイプすることができます
user@Host:~$ Sudo apt update | grep packages
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
34 packages can be upgraded. Run 'apt list --upgradable' to see them.
user@Host:~$ Sudo apt update 2>/dev/null | grep packages
34 packages can be upgraded. Run 'apt list --upgradable' to see them.
user@Host:~$