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