我怎样才能知道Arch Linux中是否已经安装了特定的软件包

我想写一个bash脚本让我检查一下,某个软件包是否已经安装在arch linux中。

我怎样才能做到这一点?

你应该使用Arch Linux的软件包管理员Pacman。

您想使用-Q操作查询已安装的本地包数据库和-i选项以获取有关该包的信息。

这给你

 pacman -Qi <packageName> 

然后,您可以使用退出代码来确定软件包是否在系统上存在(0软件包存在,1不存在)

使用-i而不是-s可确保您检查包是否正确,而不是包含名称中包名的包。

例如,如果我在仅安装了chromium-bsu (游戏)的系统上搜索chromium (网络浏览器)

 # This exits with 1 because chromium is not installed pacman -Qi chromium # This exits with 0 because chromium-bsu is installed pacman -Qs chromium 

正如随机公民指出的那样,如果你正在编写一个脚本,并且不希望Pacman污染你的输出,你当然希望将任何输出重定向到/dev/null

 pacman -Qi <packageName> > /dev/null 

您可以使用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管道用于抑制打印的输出。

我通常只是做ls /bin | grep $package 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; 

更妙的是,把它变成一个函数怎么样?

下面的代码中有两个例子。 您可以使用_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" 

尝试这个:

 isPackageInstalled() { pacman -Qi "$packageName" &> /dev/null echo $? } 

在脚本中使用和使用一样简单

 if [ $(isPackageInstalled 'libssl') ]; then # do things here echo 'Package libssl is installed' fi