检查是否安装了apt-get的包,然后安装它,如果它不是在Linux上?(Check if an a

2019-07-01 09:45发布

我工作的一个Ubuntu系统上,目前这是我在做什么:

if ! which command > /dev/null; then
   echo -e "Command not found! Install? (y/n) \c"
   read
   if "$REPLY" = "y"; then
      sudo apt-get install command
   fi
fi

这是大多数人会做什么? 还是有更好的解决方案?

Answer 1:

要检查是否packagename安装,输入:

dpkg -s <packagename>

您还可以使用dpkg-query有供您使用更简洁的输出,并接受外卡了。

dpkg-query -l <packagename>

要找出什么包拥有的command ,请尝试:

dpkg -S `which <command>`

有关详细信息,请参阅文章了解是否已安装包的Linux和dpkg的小抄 。



Answer 2:

为了一点更加明确,这里有点bash脚本中,用于检查一个包,如果需要安装它。 当然,你可以在发现包丢失,如简单地以错误代码退出做其他事情。

PKG_OK=$(dpkg-query -W --showformat='${Status}\n' the.package.name|grep "install ok installed")
echo Checking for somelib: $PKG_OK
if [ "" == "$PKG_OK" ]; then
  echo "No somelib. Setting up somelib."
  sudo apt-get --force-yes --yes install the.package.name
fi

如果脚本在GUI中运行(例如,它是一个鹦鹉螺脚本),你可能会想用“gksudo”一个替换“须藤”调用。



Answer 3:

此单行返回1(安装)或0(未安装)为“纳米”包..

$(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed")

即使包不存在/不可用。

下面的例子将安装“纳米”包,如果没有安装..

if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
  apt-get install nano;
fi


Answer 4:

我提供此更新,因为Ubuntu的加入其“个人包档案”(PPA),正如这个问题得到回答,并PPA封装具有不同的结果。

  1. 没有安装本地的Debian软件包库:

     ~$ dpkg-query -l apache-perl ~$ echo $? 1 
  2. PPA数据包中注册的主机和安装:

     ~$ dpkg-query -l libreoffice ~$ echo $? 0 
  3. PPA数据包中注册的主机,但没有安装:

     ~$ dpkg-query -l domy-ce ~$ echo $? 0 ~$ sudo apt-get remove domy-ce [sudo] password for user: Reading package lists... Done Building dependency tree Reading state information... Done Package domy-ce is not installed, so not removed 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 

也张贴在: https://superuser.com/questions/427318/test-if-a-package-is-installed-in-apt/427898



Answer 5:

UpAndAdam写道:

然而,你不能简单地依靠返​​回代码这里脚本

根据我的经验,你可以依靠dkpg的退出代码。

的dpkg -s的返回码为0,如果是安装包和1,如果不是,那么我发现最简单的解决办法是:

dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>

工作正常,我...



Answer 6:

这似乎工作得很好。

$ sudo dpkg-query -l | grep <some_package_name> | wc -l
  • 它要么返回0 ,如果没有安装或者一些数量> 0 ,如果安装。


Answer 7:

dpkg -s程序使用

我喜欢dpkg -s ,因为它与状态退出1 ,如果任何软件包安装不上,因此很容易将其自动化:

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  sudo apt-get install $pkgs
fi

也可以看看:

  • https://askubuntu.com/questions/423355/how-do-i-check-if-a-package-is-installed-on-my-server

经测试在Ubuntu 18.10。



Answer 8:

我发现所有的解决方案上面会产生假阳性如果安装一个包,然后取出尚未安装包保留在系统中。

要复制:安装包apt-get install curl
删除软件包apt-get remove curl

现在测试上面的答案。

下面的命令似乎解决这个条件:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'

这将导致一个明确的安装不安装



Answer 9:

我看中了一个基于Nultyi的回答 :

MISSING=$(dpkg --get-selections $PACKAGES 2>&1 | grep -v 'install$' | awk '{ print $6 }')
# Optional check here to skip bothering with apt-get if $MISSING is empty
sudo apt-get install $MISSING

基本上,从错误信息dpkg --get-selections是容易得多比大多数其他的解析,因为它不包括像“DEINSTALL”状态。 它也可以同时检查多个包,有些东西你不能只是错误代码做。

说明/例子:

$ dpkg --get-selections  python3-venv python3-dev screen build-essential jq
dpkg: no packages found matching python3-venv
dpkg: no packages found matching python3-dev
screen                                          install
build-essential                                 install
dpkg: no packages found matching jq

这样的grep从列表中删除已安装的包,并从AWK错误消息出来拉动包名,导致MISSING='python3-venv python3-dev jq' ,其可以被平凡插入到安装命令。

我不是盲目地发出apt-get install $PACKAGES ,因为在评论中提到,这可能会意外升级你不打算包; 不是真的按照预期是稳定的自动化流程是个好主意。



Answer 10:

$name="rsync"

[ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name


Answer 11:

这将做到这一点。 apt-get install是幂等。

sudo apt-get install command


Answer 12:

使用:

apt-cache policy <package_name>

如果没有安装它,它会显示:

Installed: none

否则,它会显示:

Installed: version


Answer 13:

这个功能已经存在于Ubuntu和Debian,在command-not-found包。



Answer 14:

apt list [packagename]

似乎是这样做的dpkg及以上APT- *工具之外的最简单方法



Answer 15:

在搬运工运行测试时,在本地而不是我也有类似的要求。 基本上,我只是想安装发现,如果他们没有安装任何的.deb文件。

# If there are .deb files in the folder, then install them
if [ `ls -1 *.deb 2> /dev/null | wc -l` -gt 0 ]; then
  for file in *.deb; do
    # Only install if not already installed (non-zero exit code)
    dpkg -I ${file} | grep Package: | sed -r 's/ Package:\s+(.*)/\1/g' | xargs dpkg -s
    if [ $? != 0 ]; then
        dpkg -i ${file}
    fi;
  done;
else
  err "No .deb files found in '$PWD'"
fi

我猜他们唯一的问题,我可以看到的是,它不检查包的版本号,所以如果.deb文件名称是一个较新的版本,那么这将不会覆盖目前安装的软件包。



Answer 16:

对于Ubuntu的是,APT提供一个相当体面的方式来做到这一点。 下面是谷歌浏览器的例子:

apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable

我重定向错误输出到零,因为容易警告不要使用它的“不稳定(CLI)”。 我怀疑名单包是稳定的,所以我认为这是确定以抛出这个警告了。 该-qq使得容易超静音。



Answer 17:

which <command>
if [ $? == 1 ]; then
    <pkg-manager> -y install <command>
fi


Answer 18:

此命令是最难忘:

dpkg --get-selections <package-name>

如果它安装它打印:

<包名称>安装

否则,将输出

没有包找不到匹配的<包名称>。

这是在Ubuntu 12.04.1(精确穿山甲)进行测试。



Answer 19:

很多事情已被告知但对我来说最简单的方法是:

dpkg -l | grep packagename


Answer 20:

在bash:

PKG="emacs"
dpkg-query -l $PKG > /dev/null || sudo apt install $PKG

请注意,您可以在PKG几个包的字符串。



Answer 21:

我用下面的方法:

which mySQL 2>&1|tee 1> /dev/null
  if [[ "$?" == 0 ]]; then
                echo -e "\e[42m MySQL already installed. Moving on...\e[0m"
        else
        sudo apt-get install -y mysql-server
                if [[ "$?" == 0 ]]; then
                        echo -e "\e[42mMy SQL installed\e[0m"
                else
                        echo -e "\e[42Installation failed\e[0m"
                fi
        fi


Answer 22:

看来,时下apt-get有一个选项--no-upgrade ,只是做了OP想要的东西:

--no-upgrade不升级软件包。 当配合使用,安装,没有任何升级将会阻止,如果他们已经安装了升级列出的软件包。

从联机帮助https://linux.die.net/man/8/apt-get

因此,你可以使用

apt-get install --no-upgrade package

package将安装只有当它不是。



文章来源: Check if an apt-get package is installed and then install it if it's not on Linux?