1

我正在编写大量的 shell 脚本,这取决于特定的包。

例如,我的一个脚本依赖于ca-certificatesand wget。如果我还没有运行apt-get -y update,那么我会收到以下错误:

包 ca-certificates 不可用,但被另一个包引用。这可能意味着该软件包丢失、已过时或只能从其他来源获得。

E: 包 'ca-certificates' 没有安装候选
E: 无法找到包 wget


我想避免apt-get -y update在每个脚本上运行。基本上,我想创建一个快捷功能,它将执行以下两件事:

  1. apt-get -y update仅在必要时运行。
  2. 仅安装未安装/最新的软件包。

到目前为止,这是我当前的功能:

function install-packages()
{
    apt-get -y update
    apt-get install -y --no-install-recommends $@
}

install-packages ca-certificates wget
4

1 回答 1

1

检查软件包是否已安装或不执行类似的操作

dpkg -l | grep vlc | awk '{print $2}'

并检查该软件包是否可用于 apt 和 apt-get 搜索类似选项。它存在,但我不记得所有新发行版都使用 apt

apt list --upgradable | awk '{print $1}'

将上面输出中的每一行(包名称)与您在脚本中定位的包进行比较。

apt update仅在必要时尝试运行具有挑战性。一件事是在 apt 生成错误时运行 apt update ,这将解决您提到的问题,但由于 apt 也可能报告其他事情的错误,所以这种方法非常无效。

如果您要做的只是防止每次重复执行相同的程序包,您可以创建一个跟踪程序上次更新时间的文件

apt update -y && echo date > ~/.track

然后仅在该时间大于某个时间段(例如 debian stable 的 1 周)时才进行更新。

编辑: 有些人说你可以做类似的事情

if [ -z "$(find /var/cache/apt/pkgcache.bin -mmin -60)" ]; then
  apt-get update
fi

在哪里-mmin -60检查最近 1 小时的 apt 包列表缓存。调整该值,除非用户或其他人不手动写入该文件,否则您就可以开始了。当某些磁盘释放应用程序删除缓存时,事情也会变得糟糕。

于 2020-12-05T01:37:09.760 回答