如何禁用“警告:apt 没有稳定的 CLI 界面......”

如何禁用“警告: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

答案1

首先,考虑一下您试图隐藏的警告的含义。理论上,apt明天可能会将其改为“分发版”而不是“软件包”(因为它“还没有稳定的 CLI 界面”),这会彻底破坏您的管道。更可能的变化是在多个地方使用“软件包”一词,导致您的管道返回无关信息,而不仅仅是您要查找的软件包数量。

但你可能并不太担心这一点,而且实际上你也没有理由担心。界面已经稳定了很多年,可能不会很快改变。那么你如何让这个警告消失呢?

在 *nix 世界中,命令行的输出通常有两种,stdout(标准输出)和 stderr(标准错误)。行为良好的程序将其正常输出发送到 stdout,并将任何警告或错误消息发送到 stderr。因此,如果您希望错误/警告消失,通常可以通过使用输出重定向丢弃 stderr 上的所有消息来实现这一点2>/dev/null。(在英语中,这是“将>第二个输出通道(2,即 stderr)重定向/dev/null(这会丢弃发送到那里的所有内容)”。

答案是:

$ sudo apt update 2>/dev/null | grep packages | cut -d '.' -f 1
4 packages can be upgraded

附注:在问题中,您的命令显示为# sudo apt...。shell#提示符暗示您在使用该命令时可能以 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.

答案2

您可以使用以下命令替代

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手册页

       -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.

这个答案的灵感来自于博客

相关内容