我正在用 Perl 为 Ubuntu 编写一个安装后脚本(与此处看到的脚本相同)。其中一个步骤是安装软件包列表。问题是,如果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-cache
并apt-get -s install
尝试捕捉所有可能性,但我似乎一直在寻找新的方法来允许失败继续执行实际的安装系统命令。
我的问题是,在 Perl 中是否有一些设施(例如一个模块,尽管我想尽可能避免安装模块,因为这应该是在新安装 Ubuntu 之后运行的第一件事)或 apt-* 或 dpkg让我确保在安装之前可以安装所有软件包,如果不能以某种方式优雅地失败,让用户决定要做什么?
注意我正在做一些事情:
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);