2011-01-07 7 views
2

Ich schreibe ein Post-Installationsskript für Ubuntu in Perl (das gleiche Skript wie gesehen here). Einer der Schritte besteht darin, eine Liste von Paketen zu installieren. Das Problem ist, dass, wenn apt-get install auf viele verschiedene Arten für eines der Pakete versagt, das Skript schlecht stirbt. Ich möchte das verhindern.Überprüfen Sie eine Liste der zu installierenden Pakete mit apt-get

Das passiert, weil apt-get install für Pakete fehlschlägt, die es nicht mag. Zum Beispiel, wenn ich versuche, einen Unsinn Wort zu installieren (dh in den falschen Paketnamen eingegeben)

$ sudo apt-get install oblihbyvl 
Reading package lists... Done 
Building dependency tree  
Reading state information... Done 
E: Unable to locate package oblihbyvl 

aber wenn anstelle der Paketname (Installation Hand von ppa)

$ sudo apt-get install handbrake 
Reading package lists... Done 
Building dependency tree  
Reading state information... Done 
Package handbrake is not available, but is referred to by another package. 
This may mean that the package is missing, has been obsoleted, or 
is only available from another source 

E: Package 'handbrake' has no installation candidate 
$ apt-cache search handbrake 
handbrake-cli - versatile DVD ripper and video transcoder - command line 
handbrake-gtk - versatile DVD ripper and video transcoder - GTK GUI 

etc holt wurde, etc ...

Ich habe versucht, die Ergebnisse von apt-cache und apt-get -s install zu analysieren, um alle Möglichkeiten zu fangen, bevor Sie die Installation zu tun, aber ich scheine immer neue Wege zu finden, um Fehler zu ermöglichen, den eigentlichen Systembefehl zu installieren.

Meine Frage ist, gibt es eine Möglichkeit in Perl (zB ein Modul, obwohl ich die Installation von Modulen möglichst vermeiden möchte, da dies nach einer Neuinstallation von Ubuntu das erste Ding sein sollte) oder apt- * oder dpkg, damit ich sicher sein kann, dass alle Pakete vor der Installation installiert werden können, und wenn sie nicht auf eine Weise fehlschlagen, die den Benutzer entscheiden lässt, was zu tun ist?

N.B. Ich tue etwas entlang der Linien von:

my @list_of_install_candidates = (...); 
my @to_install = grep { my $output = qx{ apt-get -s install $_ }; parse_output($output); } @list_of_install_candidates; 
system('apt-get', 'install', @to_install); 

Antwort

2

Sie könnten apt-cache policy versuchen. Beispiele:

$ apt-cache policy handbrake 
handbrake: 
    Installed: (none) 
    Candidate: (none) 
    Version table: 

$ apt-cache policy foo 
N: Unable to locate package foo 

$ apt-cache policy openbox 
openbox: 
    Installed: 3.4.11.1-1 
    Candidate: 3.4.11.1-1 
    Version table: 
*** 3.4.11.1-1 0 
     500 http://mirrors.xmission.com/ubuntu/ maverick/universe i386 Packages 
     100 /var/lib/dpkg/status 

Alles mit einer nicht leeren Versionstabelle sollte installierbar sein.

+0

Selbst etwas mit einer nicht leeren Version kann zu Konflikten mit anderen installierten Paketen führen. – ysth

+0

hmm, in diesem Fall wäre es vielleicht sinnvoller, die Ausgabe eines Trockenlaufs zu parsen ('apt-get -s install ...') – cam

+0

@cam, danke, ich werde es versuchen. @ysth, das kann in Ordnung sein, da die Absicht ist, das erste Ding zu sein, das nach einer Installation läuft, solange die Pakete nicht mit den Distro-Standard-Paketen kollidieren (und das sollten sie nicht), sollte dies in Ordnung sein. –