检查要使用apt-get安装的软件包列表

时间:2011-01-07 17:49:46

标签: perl ubuntu debian apt

我正在为Perl编写Ubuntu的安装后脚本(与看到的here相同的脚本)。其中一个步骤是安装包列表。问题是,如果apt-get install以任何一种软件包的许多不同方式失败,脚本就会崩溃。我想防止这种情况发生。

这是因为apt-get install对于它不喜欢的包失败的方式。例如,当我尝试安装一个无意义的单词(即键入错误的包名称)时

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

但是如果包装名称已被废弃(从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

等等...

我尝试解析apt-cacheapt-get -s install的结果以尝试在安装之前捕获所有可能性,但我似乎一直在寻找新的方法来允许故障继续到实际的安装系统命令。

我的问题是,在Perl中是否有一些工具(例如一个模块,但我想尽可能避免安装模块,因为这应该是在新安装Ubuntu之后运行的第一件事)或者apt- *或dpkg,这将让我确保在安装之前可以安装所有软件包,如果没有以某种方式优雅地失败,让用户决定做什么?

N.B。我正在做一些事情:

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);

1 个答案:

答案 0 :(得分:2)

您可以尝试apt-cache policy。示例:

$ 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

任何带有非空白版本表的内容都应该是可安装的。