web-dev-qa-db-ja.com

「警告:aptには安定したCLIインターフェースがありません...」を無効にする方法

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://askubuntu.com/questions/49958/how-to-find-the-number-of-packages-needing-update-from-the-command-line

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

7
CorruptComputer

まず、非表示にしようとしている警告の意味を検討してください。理論的には、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.
6
Dave Sherohman

次のコマンドで代替を使用できます

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

2
Kerolos William

単純にエラーを/ 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:~$
0