[英]How can I find the name of the process of an app running in Arch Linux
[英]How can I find out, whether a specific package is already installed in Arch Linux
我想寫一個 bash 腳本,讓我檢查某個 package 是否已經安裝在 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
正如Random Citizen指出的那樣,如果您正在編寫腳本並且不希望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
pacman -Q pkgName
如果未安裝 package,您將收到一條錯誤消息:
error: pacmage 'pkgName' was not found
如果安裝了 package,則會打印一行:
pkgName x.y.z-r
pacman -Qi pkgName
的行為方式相同,只是打印有關現有 package 的詳細信息。
Personnaly,我使用以下內容:
將此附加到您的~/.bashrc
,然后獲取它:
havei() {
package=$1
if $(pacman -Qi $package &>/dev/null); then
echo -e "\e[92m[ 🗸 ] $package is installed \e[39m"
else
echo -e "\e[91m[ ❌ ] $package is not installed \e[39m"
fi
}
然后你可以簡單地在你的日常終端中使用它:
havei firefox
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.