我有一个基于 Ubuntu 16.04 的设备,其中安装了来自公共存储库的软件包。但不直接使用公共存储库。而是使用更新服务器下载软件包,然后将它们放入一个文件中。系统上的更新程序获取该文件,提取软件包并安装它们。
最近,base-files 包给我带来了一些麻烦,其中包含文件 /etc/issue(似乎包含 Ubuntu 版本):
Setting up base-files (9.4ubuntu4.8) ...
Configuration file '/etc/issue'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
到目前为止,更新程序使用以下命令行安装了该软件包:
DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" --quiet --yes --force-yes install [Absolute path of the packages]
出现该问题后,我尝试了以下命令行:
DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get -o Dpkg::Options::="--force-confnew" --quiet --yes --force-yes install [Absolute path of the packages]
但不幸的是,这并没有改变任何事情。
现在我的问题是,是否有任何选择可以解决该问题。
答案1
感谢德国 Ubuntu 论坛的用户 seahawk1986: https://forum.ubuntuusers.de/topic/kommandozeilen-abfrage-bei-paketinstallation-u/
我找到了解决问题的方法: https://debian-handbook.info/browse/en-US/stable/sect.automatic-upgrades.html#id-1.9.17.9
我写了个脚本:
#!/bin/sh
export DEBIAN_FRONTEND=noninteractive
/usr/bin/yes '' | /usr/bin/apt-get --yes --force-yes --quiet -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install "$@"
- --yes - 对每个问题都回答“是”
- --force-yes - 强制对每个问题都回答“是”
- --quiet — 不显示任何进度条。
- -o Dpkg::Options::="--force-confdef" - 如果需要替换配置文件,则使用默认答案。
- -o Dpkg::Options::="--force-confold" - 如果需要替换配置文件,则使用旧配置文件。以防 --force-confdef 不起作用。
- “$@”——我传递给该脚本的所有包路径。
- export DEBIAN_FRONTEND=noninteractive - 安装/更新软件包时仅使用非交互模式。
有趣的是
/usr/bin/yes '' |
到目前为止,我从未使用过“yes”。它只是打印“y”后跟换行符(表示 Enter),然后可以将其传送到标准输入 (stdin)。在这种情况下,我们只使用一个空字符串。这样,“yes”就会用 Enter 输入淹没 stdin。如果弹出问题,在大多数情况下,只需按 Enter 即可回答该问题,并使用默认选项。这就是帮助我的魔法。
希望这也能帮助其他面临相同或类似问题的人。