Как я могу получить «подробный» код выхода apt-get?

12

Как я могу получить «подробный» код выхода для apt-getтаких ошибок, как это

Package google-chrome is a virtual package provided by:
  google-chrome-stable 29.0.1547.76-r223446
  google-chrome-beta 30.0.1599.47-1
You should explicitly select one to install.

E: Package 'google-chrome' has no installation candidate

код выхода отличается от ошибок загрузки, подобных этой

Err http://dl.google.com/linux/chrome/deb/ stable/main google-chrome-stable amd64 29.0.1547.76-r223446
  Something wicked happened resolving 'dl.google.com:http' (-11 - System error)

В настоящее время обе ошибки завершаются с 100

По сути, я хотел бы, чтобы ошибки загрузки выходили с кодом, отличным от ошибок, подобных первому. Если возможно, я бы хотел, чтобы у каждой конкретной ошибки был свой код выхода, но приведенный выше пример - это минимум, который мне нужен. Как я могу сделать это в стандартной установке Ubuntu без дополнительного программного обеспечения (за исключением aptitude)?

харакири
источник
Вы можете заключить команду apt-get в скрипт, который анализирует вывод. Или это считается «дополнительным программным обеспечением»? Кроме того, чтобы обнаружить ошибки загрузки, попробуйте apt-get --download-onlyсначала.
Иос
Ах, это имеет смысл. Возможно, вы могли бы сначала проверить существование пакета X, выполнив apt-cache policy X?
Иос
Опять же, вам нужно будет grep вывод. Я предполагаю, что выполнение apt-cache policy google-chromeне дает вам строку со словом «Кандидат», тогда как apt-cache policy google-chrome-stableбудет.
Иос
OK. Я перевожу это обсуждение в чат и ввожу это предложение как (частичный) ответ.
Иос

Ответы:

1

Не полный ответ, но вы можете сначала проверить наличие пакетов, выполнив apt-cache policy Xи выбрав выходные данные для «Кандидат (нет)» или «Не удалось найти пакет Х» и т. Д.

Jos
источник
Пока проголосовали, но, как вы сказали, это частично. Не стесняйтесь удалять все ваши комментарии, которые сейчас есть в ответе. Спасибо за вашу помощь
Кири
15

Я полагаю, что это не случай XY, и вы просто хотите быть в состоянии отладить apt-get в целом. При таких предположениях вот мой ответ.

Из man apt.conf:

ВАРИАНТЫ ОТЛАДКИ

Включение опций в разделе Debug :: приведет к отправке отладочной информации в стандартный поток ошибок программы, использующей библиотеки apt, или к включению специальных режимов программы, которые в первую очередь полезны для отладки поведения apt.

Следовательно, вам нужно только активировать правила для каждого из режимов отладки apt-get:

  • Debug :: pkgProblemResolver : включает вывод о решениях, принятых dist-upgrade, upgrade, install, remove, purge.
  • Debug :: NoLocking : отключает все блокировки файлов. Это может использоваться для запуска некоторых операций (например, apt-get -s install) от имени пользователя без полномочий root.
  • Debug :: pkgDPkgPM : распечатывает фактическую командную строку каждый раз, когда apt вызывает dpkg (1).

Эти 3 являются первыми, которые рекомендуются справочной страницей, а первая поможет вам отладить первую отображаемую ошибку. Для второго вам может понадобиться:

  • Debug :: Acquire :: http : Распечатать информацию, связанную с загрузкой пакетов, используя HTTP. Существует также https, ftp, cdrom.

Страница man имеет много больше, вы можете легко перечислить их, используя man apt.conf | grep -A5 -i debug.

Все это должно быть написано с использованием правильного синтаксиса, и они принимают логические значения:

Debug::*::*  "true";

или если вы хотите использовать несколько строк:

Debug {
  Acquire {
    http "true";
    ftp "true";
  };
  NoLocking "true";
};

Если вы хотите работать только для экземпляра apt-get, вы можете использовать ключ -o/ --option:

sudo apt-get -o Debug::pkgProblemResolver=true -o Debug::Acquire::http=true -f install 

Другой способ - создать свой персонализированный файл конфигурации и загрузить его с ключом -c/ --config-file:

sudo apt-get -c debug-apt.conf install hello

Насчет изменения кодов выхода я считаю, что вы не можете, если вы не измените исходный код. apt-getэто современное программное обеспечение, так как в нем есть продвинутые методы для отладки процесса без необходимости полагаться на коды выхода.

Braiam
источник
Я на самом деле пытаюсь поместить эти команды в сценарий, который может выполняться без присмотра. Как бы я использовал это в скрипте bash, чтобы найти, если произошла первая ошибка?
Кири
Я также хотел бы сделать это только для конкретного случая apt-get, а не все время.
Кири
@ minerz029 вы можете использовать -oопцию для запуска специальных команд. Обновил мой ответ.
Брайам
Что касается первого комментария, вы должны сделать что-то умное с анализом вывода. Я понятия не имею, как ты можешь это сделать.
Брайам
Я действительно заставил его работать с выводом apt-cache policy PACKAGE, как сказал Джос. Я пытался проверить, можно ли установить пакет, возможно, я не задал правильный вопрос, но это хороший ответ
Кири