检查是否安装了软件包,如果没有安装,请安装
我正在开发一个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
这是大多数人会做的吗? 还是有一个更优雅的解决scheme?
要检查是否安装了packagename
,请input:
dpkg -s <packagename>
你也可以使用dpkg-query
来实现你的目的,并且接受通配符。
dpkg-query -l <packagename>
要find哪个包拥有该command
,请尝试:
dpkg -S `which <command>`
有关更多详细信息,请参阅文章查找软件包是否安装在Linux和dpkg备忘单中 。
为了更清楚一点,下面是一些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中运行(例如,它是一个Nautilus脚本),则可能需要用'gksudo'replace'sudo'调用。
这一个class轮返回1(安装)或0(未安装)的'纳米'包。
$(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed")
即使包不存在/不可用。
下面的例子安装了'nano'包,如果它没有安装。
if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ]; then apt-get install nano; fi
我提供了这个更新,因为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
UpAndAdam写道:
但是,您不能简单地依靠这里的脚本返回代码
根据我的经验,您可以依靠dkpg的退出代码。
如果安装了软件包,则dpkg -s的返回代码为0,如果不是,则为1 ,所以我find的最简单的解决scheme是:
dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>
适合我…
这似乎工作得很好。
$ sudo dpkg-query -l | grep <some_package_name> | wc -l
- 如果未安装,则返回
0
如果安装,则返回一些> 0
数字。
我发现上面的所有解决scheme可能会产生一个误报,如果一个软件包已安装,然后删除,但安装软件包保留在系统上。
复制:安装软件包apt-get install curl
删除包apt-get remove curl
现在testing以上的答案。
下面的命令似乎解决了这个问题:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
这将导致一个明确的安装或未安装
这将做到这一点。 apt-get install
是幂等的。
sudo apt-get install command
这个function已经存在于Ubuntu和Debian的command-not-found
软件包中。
$name="rsync" [ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name
使用:
apt-cache policy <package_name>
如果没有安装,它会显示:
Installed: none
否则会显示:
Installed: version
apt list [packagename]
似乎是在dpkg和较老的apt- *工具之外完成的最简单的方法
which <command> if [ $? == 1 ]; then <pkg-manager> -y install <command> fi
这个命令是最令人难忘的:
dpkg --get-selections <package-name>
如果安装它打印:
<package-name>安装
否则,它打印
找不到匹配<package-name>的软件包。
这是在Ubuntu 12.04.1(精确穿山甲)testing。