Jak mogę uzyskać „pełny” kod wyjścia apt-get?

12

Jak mogę uzyskać „pełny” kod zakończenia dla apt-gettakich błędów

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

mieć inny kod wyjścia niż takie błędy pobierania

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)

Obecnie oba błędy kończą się za pomocą 100

Zasadniczo chciałbym, aby błędy pobierania zakończyły się z innym kodem niż błędy podobne do pierwszego. Jeśli to możliwe, chciałbym, aby każdy konkretny błąd miał inny kod wyjścia, ale powyższy przykład to minimum, którego potrzebuję. Jak mogę to zrobić w waniliowej instalacji Ubuntu bez dodatkowego oprogramowania (z wyjątkiem aptitude)?

kiri
źródło
Możesz zawinąć komendę apt-get w skrypt analizujący dane wyjściowe. Czy to się liczy jako „dodatkowe oprogramowanie”? Aby wykryć błędy pobierania, rozważ apt-get --download-onlynajpierw zrobienie tego .
Jos
Ach, to ma sens. Być może mógłbyś najpierw zweryfikować istnienie pakietu X apt-cache policy X?
Jos
Ponownie trzeba by grepować wyjście. Zakładam, że robienie apt-cache policy google-chromenie daje ci linii ze słowem „Kandydat”, podczas gdy apt-cache policy google-chrome-stablebyłoby.
Jos
DOBRZE. Poruszam tę dyskusję na czacie i wpisuję tę sugestię jako (częściową) odpowiedź.
Jos

Odpowiedzi:

1

Nie jest to kompletna odpowiedź, ale możesz najpierw przetestować istnienie pakietów, wykonując apt-cache policy Xi grepując dane wyjściowe dla „Candidate (none)” lub „Could not find package X” itp.

Jos
źródło
Na razie głosowane, ale jak powiedziałeś, jest częściowe. Nie krępuj się usunąć wszystkie komentarze, które są w odpowiedzi teraz. Dzięki za pomoc
kiri,
15

Wierzę, że to nie jest przypadek XY, ​​a ty po prostu chcesz móc ogólnie debugować apt-get. Przy takich założeniach oto moja odpowiedź.

Z man apt.conf:

OPCJE DEBUGOWANIA

Włączenie opcji w sekcji Debug :: spowoduje wysłanie informacji debugowania do standardowego strumienia błędów programu wykorzystującego biblioteki apt lub włączenie specjalnych trybów programu, które są przede wszystkim przydatne do debugowania zachowania apt.

Dlatego musisz tylko aktywować reguły dla każdego z zachowań debugowania apt-get:

  • Debug :: pkgProblemResolver : włącza dane wyjściowe dotyczące decyzji podejmowanych przez dist-upgrade, upgrade, install, remove, purge.
  • Debug :: NoLocking : wyłącza blokowanie wszystkich plików. Można tego użyć do uruchomienia niektórych operacji (na przykład apt-get -s install) jako użytkownik inny niż root.
  • Debug :: pkgDPkgPM : wypisuje rzeczywisty wiersz poleceń za każdym razem, gdy apt wywołuje dpkg (1).

Te trzy są pierwszymi, które strona podręcznika zaleca, a pierwsza pomoże ci w debugowaniu pierwszego wyświetlanego błędu. Po drugie możesz potrzebować:

  • Debug :: Acquire :: http : Wydrukuj informacje związane z pobieraniem pakietów za pomocą HTTP. Jest też https, ftp, cdrom.

Strona podręcznika ma znacznie więcej, możesz je łatwo wymienić man apt.conf | grep -A5 -i debug.

Wszystko to powinno być napisane przy użyciu poprawnej składni i są to wartości logiczne:

Debug::*::*  "true";

lub jeśli chcesz użyć wielu linii:

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

Jeśli chcesz uruchomić tylko dla instancji apt-get, możesz użyć przełącznika -o/ --option:

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

Inną metodą jest utworzenie spersonalizowanego pliku konfiguracyjnego i załadowanie go za pomocą przełącznika -c/ --config-file:

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

Jeśli chodzi o zmianę kodów wyjścia, uważam, że nie możesz tego zrobić, chyba że zmienisz kod źródłowy. apt-getjest najnowocześniejszym oprogramowaniem, ponieważ ma zaawansowane metody debugowania procesu bez konieczności polegania na kodach zakończenia.

Braiam
źródło
Właściwie próbuję umieścić te polecenia w skrypcie, który może działać bez nadzoru. Jak miałbym tego użyć w skrypcie bash, aby sprawdzić, czy wystąpił pierwszy błąd?
kiri
Chciałbym to zrobić tylko dla konkretnego przypadku apt-get, nie przez cały czas.
kiri
@ minerz029 możesz użyć -oopcji do uruchamiania poleceń ad-hoc. Zaktualizowałem moją odpowiedź.
Braiam
Jeśli chodzi o pierwszy komentarz, powinieneś zrobić coś sprytnego z parsowaniem wyników. Nie mam pojęcia, jak możesz to zrobić.
Braiam
Naprawdę udało mi się pracować z grepowaniem wyjścia apt-cache policy PACKAGE, jak powiedział Jos. Próbowałem sprawdzić, czy pakiet można zainstalować, być może nie zadałem właściwego pytania, ale to dobra odpowiedź
kiri,