Arch Linuxに特定のパッケージがすでにインストールされているかどうかを確認できるbashスクリプトを書きたいのですが。
どうやってやるの?
Arch LinuxのパッケージマネージャーであるPacmanを使用する必要があります。
-Q
操作を使用して、インストールされているローカルパッケージデータベースをクエリし、-i
オプションを使用してパッケージに関する情報を取得します。
これはあなたに与える
pacman -Qi <packageName>
次に、終了コードを使用して、パッケージがシステムに存在するかどうかを判断できます(0はパッケージが存在し、1は存在しません)
-i
ではなく-s
を使用すると、名前にパッケージ名を含むパッケージの存在ではなく、そのパッケージを正確に確認できます。
たとえば、chromium-bsu
(ゲーム)のみがインストールされているシステムでchromium
(Webブラウザー)を検索すると、
# This exits with 1 because chromium is not installed
pacman -Qi chromium
# This exits with 0 because chromium-bsu is installed
pacman -Qs chromium
ランダムな市民 が指摘したように、スクリプトを記述していて、パックマンに出力を汚染させたくない場合は、出力を/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
を実行します($ 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
を使用して、1つのパッケージのみをインストールできます。 _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