我正在编写一个脚本,它将输出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作业的不一致通知中使用这个返回的字符串以及一些额外的信息,它非常糟糕地破坏了我的输出。
我已经看过了,但没有一个对我有用:
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
发布于 2019-03-13 08:30:27
首先,考虑一下你试图隐藏的警告的含义。理论上,apt
可能会在明天更改为“分发”,而不是“包”(因为它“还没有一个稳定的CLI接口”),这将完全破坏您的管道。更有可能的变化是在多个地方使用“包”这个词,导致管道返回无关的信息,而不是只返回要查找的包计数。
但你可能不太担心,而且,实际上,你没有理由这样做。这个界面已经稳定了好几年了,而且可能不会很快改变。那你是怎么让这个警告消失的呢?
在*nix世界中,对命令行的输出通常有两种形式: stdout (标准输出)和stderr (标准错误)。行为良好的程序将其正常输出发送到stdout,并将任何警告或错误消息发送给stderr。因此,如果您希望错误/警告消失,通常可以通过使用输出重定向2>/dev/null
在stderr上丢弃任何消息来实现这一点。(在英语中,这是“重定向(>
) -第二个输出通道(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.
https://serverfault.com/questions/958003
复制相似问题