我想编写一个bash脚本,允许我检查一下是否已经在arch linux中安装了某个软件包。
我该怎么做?
答案 0 :(得分:28)
你应该使用Arch Linux的包管理器Pacman。
您希望使用-Q
操作查询已安装的本地软件包数据库,并使用-i
选项获取有关软件包的信息。
这会给你
pacman -Qi <packageName>
然后,您可以使用退出代码来确定系统上的包是否存在(0包存在,1它不存在)
使用-i
而不是-s
可确保您确切地检查该包,而不是因为其名称中包含包名的包的存在。
例如,如果我在仅安装chromium
(游戏)的系统上搜索chromium-bsu
(网络浏览器),
# This exits with 1 because chromium is not installed
pacman -Qi chromium
# This exits with 0 because chromium-bsu is installed
pacman -Qs chromium
正如Random Citizen指出的那样,如果您正在编写脚本并且不希望Pacman污染您的输出,您当然希望将任何输出重定向到/dev/null
:
pacman -Qi <packageName> > /dev/null
答案 1 :(得分:3)
您可以使用arch包管理工具 pacman
正如您在Arch-Wiki中所看到的,-Qs
选项可用于在已安装的软件包中进行搜索。
如果包存在,pacman -Qs
将以退出代码0退出,否则退出代码1
您的脚本可能如下所示:
package=firefox
if pacman -Qs $package > /dev/null ; then
echo "The package $package is installed"
else
echo "The package $package is not installed"
fi
> /dev/null
管道用于抑制打印输出。
答案 2 :(得分:1)
我通常只做ls /bin | grep $package
(用我正在寻找的包替换$ package)。计算机也很快。
这取决于程序包的名称,因为这将列出名称中包含$ package的所有已安装的可执行文件。不过,如果您的名字中包含以$ package安装的可执行文件,那么您所寻找的软件包很可能已经安装。
这是一个更准确的一个:
package="lshw";
check="$(sudo pacman -Qs --color always "${package}" | grep "local" | grep "${package} ")";
if [ -n "${check}" ] ; then
echo "${package} is installed";
elif [ -z "${check}" ] ; then
echo "${package} is NOT installed";
fi;
更好的是,把它变成一个功能怎么样?
以下代码中有2个示例。您可以使用_install
只安装一个软件包。您可以使用_installMany
安装任意数量的软件包。我包含了这两个函数,因为_installMany
有点复杂,查看稍微简单的_install
函数可能有助于理解它。
#!/bin/bash
_isInstalled() {
package="$1";
check="$(sudo pacman -Qs --color always "${package}" | grep "local" | grep "${package} ")";
if [ -n "${check}" ] ; then
echo 0; #'0' means 'true' in Bash
return; #true
fi;
echo 1; #'1' means 'false' in Bash
return; #false
}
# `_install <pkg>`
_install() {
package="$1";
# If the package IS installed:
if [[ $(_isInstalled "${package}") == 0 ]]; then
echo "${package} is already installed.";
return;
fi;
# If the package is NOT installed:
if [[ $(_isInstalled "${package}") == 1 ]]; then
sudo pacman -S "${package}";
fi;
}
# `_installMany <pkg1> <pkg2> ...`
# Works the same as `_install` above,
# but you can pass more than one package to this one.
_installMany() {
# The packages that are not installed will be added to this array.
toInstall=();
for pkg; do
# If the package IS installed, skip it.
if [[ $(_isInstalled "${pkg}") == 0 ]]; then
echo "${pkg} is already installed.";
continue;
fi;
#Otherwise, add it to the list of packages to install.
toInstall+=("${pkg}");
done;
# If no packages were added to the "${toInstall[@]}" array,
# don't do anything and stop this function.
if [[ "${toInstall[@]}" == "" ]] ; then
echo "All packages are already installed.";
return;
fi;
# Otherwise, install all the packages that have been added to the "${toInstall[@]}" array.
printf "Packages not installed:\n%s\n" "${toInstall[@]}";
sudo pacman -S "${toInstall[@]}";
}
package="lshw";
_install "${package}";
packages=("lshw" "inkscape");
_installMany "${packages[@]}";
#Or,
_installMany "lshw" "inkscape"
答案 3 :(得分:1)
试试这个:
isPackageInstalled() {
pacman -Qi "$packageName" &> /dev/null
echo $?
}
在脚本中使用就像
一样简单if [ $(isPackageInstalled 'libssl') ]; then
# do things here
echo 'Package libssl is installed'
fi