Назад | Перейти на главную страницу

Как отключить «ВНИМАНИЕ: apt не имеет стабильного интерфейса командной строки…»

Я пытаюсь написать сценарий, который выведет количество пакетов с возможностью обновления из 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

Есть ли способ отключить это предупреждение? Я буду использовать эту возвращенную строку вместе с некоторой дополнительной информацией в уведомлении Discord от задания cron, и это ужасно испортит мой вывод.

Я уже смотрел на них, но ни один из них у меня не работал:

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 завтра может измениться и называть их «дистрибутивами» вместо «пакетов» (потому что у него «еще нет стабильного интерфейса командной строки»), и это полностью нарушит ваш конвейер. Более вероятным будет изменение, в котором слово «пакеты» используется в нескольких местах, в результате чего конвейер будет возвращать постороннюю информацию, а не только количество пакетов, которое вы ищете.

Но вы, вероятно, не слишком беспокоитесь об этом, и, если честно, нет причин, по которым вам следует беспокоиться. Интерфейс был стабильным в течение многих лет и, вероятно, в ближайшее время не изменится. Так как же сделать так, чтобы это предупреждение исчезло?

В мире * nix вывод в командную строку обычно бывает двух видов: 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.... В # Приглашение оболочки подразумевает, что вы, вероятно, вошли в систему как 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.

Вы можете использовать альтернативу с помощью следующей команды

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.

Этот ответ был вдохновлен этим блог

Вы можете просто передать ошибку в / 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:~$