当 apt-get 安装遇到无法找到软件包的问题时继续出错

当 apt-get 安装遇到无法找到软件包的问题时继续出错

当我运行以下命令时:

sudo apt-get install vim abcde php5-cli

它会失败并显示以下消息,这是预期的行为:

E:无法找到包 abcde`。

我希望它能够安装vim,即使出现错误,也abcde继续安装php5-cli软件包。这意味着我希望apt-get继续沿着列表向下安装,即使它找不到某些软件包。

我试过了:

sudo apt-get install --ignore-missing vim abcde php5-cli

答案1

简短回答:有可能您实际上并不想这样做。

这是为什么? 关于这个特定功能已经有很多讨论。其中一个讨论是(重复)错误报告以及与其相链接的那个。

错误报告中的讨论还解释了“--ignore-missing”仅适用于下载包时出现问题的情况,而根据 'apt-get' 的信息,该包本来应该存在。这也解释了这里并在文档。

有解决方法吗?

如果在阅读了之前的资料后,你仍然非常确定要这样做,那么另一方面,也存在(次优但相当安全的)选项,例如用户“Aleksandr Levchuk”指定的选项这里

for i in package1 package2 package3; do
  sudo apt-get install $i
done

或者,如果您愿意,可以使用最少修改的一行代码:

for i in package1 package2 package3; do sudo apt-get install $i; done

如果包很多,可以添加,-y这样就不会重复要求确认:

for i in package1 package2 package3; do
  sudo apt-get install -y $i
done

或者:

for i in package1 package2 package3; do sudo apt-get install -y $i; done

希望这可以帮助。

答案2

尽管其他答案确实有效,但每个包执行单独的安装调用存在一些问题:

  • 它消除了很多要点/优势,apt以及提前确定哪些包会共享依赖关系或发生冲突的能力
  • 如果需要 sudo(通常),则在安装所有软件包之前可能会达到 sudo 超时

最近,我遇到了这个问题,因为我正在将个人机器从一个 Ubuntu 18.04(Bionic)安装移动到另一个较新的干净版本的 Ubuntu 20.04(Focal),但想在新机器上安装相同的软件包......我想出了一个很好的解决方案:

我从一个包含列表的文件开始从旧机器生成,每个包名称都在单独的行上,可以通过以下命令轻松生成:

apt list --installed 2>/dev/null | sed 's/\/.*//g > packages'

然后,我通过 apt 运行文件列表,将列表过滤为新机器/存储库上可用且非虚拟的所有软件包,同时将结果传输到另一个文件,回显进度,并最终安装生成的软件包:

# Filter packages for those available
while read package; do apt show "$package" 2>/dev/null | grep -qvz 'State:.*(virtual)' && echo "$package" >>packages-valid && echo -ne "\r\033[K$package"; done <packages

# Install the available packages all at once
sudo apt install $(tr '\n' ' ' <packages-valid)

这确实有效!

希望这也能被其他人所接受。:)

答案3

避免这种情况的一种方法是调用 apt-get每个包裹一次

echo package1 package2 package3 | xargs -n 1 sudo apt-get install -y

或者作为函数

function install_ignore_fail { echo "$*" | xargs -n 1 sudo apt-get install -y; }

install_ignore_fail package1 package2 package3

答案4

我想出了一个功能,它允许安装一堆软件包,并忽略那些不可用且可能破坏完整安装的软件包。

install_aval_package() {
for i in $1
  do 
     if [ -z "$(apt-cache madison $i 2>/dev/null)" ]; then
       echo " > Package $i not available on repo."
     else
       echo " > Add package $i to the install list"
     packages="$packages $i"
     fi
 done
 echo "$packages" #you could comment this.
 apt-get -y install $packages
}

像这样使用它,

install_aval_package "bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail"

或者像这样,

install_aval_package "bmon \
                  curl \
                  dialog \
                  git \
                  htop \
                  language-pack-en-base \
                  molly-guard \
                  nano \
                  net-tools \
                  ntp \
                  openssh-server \
                  software-properties-common \
                  ssh \
                  sudo \
                  wget \
                  whiptail"

在这种情况下,输出包含存储库中所有请求的包,

 > Add package bmon to the install list
 > Add package curl to the install list
 > Add package dialog to the install list
 > Add package git to the install list
 > Add package htop to the install list
 > Add package language-pack-en-base to the install list
 > Add package molly-guard to the install list
 > Add package nano to the install list
 > Add package net-tools to the install list
 > Add package ntp to the install list
 > Add package openssh-server to the install list
 > Add package software-properties-common to the install list
 > Add package ssh to the install list
 > Add package sudo to the install list
 > Add package wget to the install list
 > Add package whiptail to the install list
 bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail bmon curl dialog git htop language-pack-en-base molly-guard nano net-tools ntp openssh-server software-properties-common ssh sudo wget whiptail
Reading package lists... Done
Building dependency tree       
Reading state information... Done
etc....

相关内容