Linux

如何禁用“警告:apt 沒有穩定的 CLI 界面…”

  • August 21, 2021

我正在嘗試編寫一個腳本,該腳本將輸出來自 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

首先,考慮您試圖隱藏的警告的含義。從理論上講,apt明天可能會更改為將它們稱為“發行版”而不是“包”(因為它“還沒有穩定的 CLI 界面”),這將完全破壞您的管道。更可能的變化是在多個地方使用“包”一詞,導致您的管道返回無關資訊,而不僅僅是您正在尋找的包計數。

但是您可能並不太擔心,而且實際上,您沒有理由擔心。該界面多年來一直很穩定,並且可能不會很快改變。那麼你如何讓這個警告消失呢?

在 *nix 世界中,命令行的輸出通常有兩種形式,stdout(標準輸出)和 stderr(標準錯誤)。表現良好的程序將其正常輸出發送到標準輸出,並將任何警告或錯誤消息發送到標準錯誤。因此,如果您希望錯誤/警告消失,您通常可以通過使用輸出重定向丟棄 stderr 上的任何消息來完成此操作2>/dev/null。(在英語中,這是“重定向(>)第二個輸出通道(2,這是標準錯誤)到/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