我正在尝试编写一个脚本,用于输出 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
答案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.
这个答案的灵感来自于博客