リストされているすべてのパッケージがbashにインストールされているかどうかを確認します


9

私のバイナリは、これらのboostライブラリとそれぞれのパッケージに依存しています。

NAME                                  |          PACKAGE:
--------------------------------------+-----------------------------------
libboost_serialization.so.1.55.0      |  libboost-serialization1.55.0
libboost_thread.so.1.55.0             |  ibboost-thread1.55.0
libboost_date_time.so.1.55.0          |  libboost-date-time1.55.0
libboost_signals.so.1.55.0            |  libboost-signals1.55.0

だから私はパッケージのリストを定義したいと思います:

boostlibnames="libboost-serialization1.55.0 libboost-thread1.55.0 libboost-date-time1.55.0 libboost-signals1.55.0"

そして、それらがすべてインストールされているかどうかを確認してから、実際に実行しapt-get installます。aptがパッケージが既にインストールされているかどうかを自動的にチェックすることはわかっていますが、不足しているライブラリをインストールする前に、ユーザーにプロンプ​​トを表示したいのですが。

それで、リストされたすべてのライブラリ(上記の変数)がインストールされているかどうかを確認する良い方法はありますか?


適切なDebianパッケージを作成し、aptに依存関係を処理させる
ivanivan

@ivanivanこれは社内のアプリケーションであり、もちろんオープンソースではありません。
トマーシュZato -復活モニカ

debファイルやその他の何かを社内企業以外に配布する必要があるという意味ではありません。パッケージングシステムの依存関係の解決を使用するだけです。ヘック、このQ上のメソッドを使用/インストールDEPSを得るために、偽のパッケージを作成するには- unix.stackexchange.com/questions/318117/...を
ivanivan

回答:


13

このdpkg -sコマンドは、インストールされているパッケージのステータスを返します。たとえば、私のシステムで、firefoxインストールされているものとされてneditいないものを実行すると、次のようになります。

$ dpkg -s firefox
Package: firefox
Status: install ok installed
Priority: optional
Section: web
Installed-Size: 94341
Maintainer: Clement Lefebvre <root@linuxmint.com>
Architecture: amd64
Version: 41.0~linuxmint1+betsy
Replaces: firefox-l10n-af, firefox-l10n-ar, firefox-l10n-be, firefox-l10n-bg, firefox-l10n-bn-bd, firefox-l10n-ca, firefox-l10n-cs, firefox-l10n-da, firefox-l10n-de, firefox-l10n-el, firefox-l10n-en-gb, firefox-l10n-en-us, firefox-l10n-eo, firefox-l10n-es, firefox-l10n-et, firefox-l10n-eu, firefox-l10n-fa, firefox-l10n-fi, firefox-l10n-fr, firefox-l10n-fy, firefox-l10n-gl, firefox-l10n-gu, firefox-l10n-he, firefox-l10n-hi, firefox-l10n-hr, firefox-l10n-hu, firefox-l10n-id, firefox-l10n-is, firefox-l10n-it, firefox-l10n-ja, firefox-l10n-kn, firefox-l10n-ko, firefox-l10n-lt, firefox-l10n-lv, firefox-l10n-nb, firefox-l10n-nl, firefox-l10n-nn, firefox-l10n-pl, firefox-l10n-pt, firefox-l10n-pt-br, firefox-l10n-ro, firefox-l10n-ru, firefox-l10n-sk, firefox-l10n-sl, firefox-l10n-sq, firefox-l10n-sr, firefox-l10n-sv, firefox-l10n-th, firefox-l10n-tr, firefox-l10n-uk, firefox-l10n-zh
Provides: gnome-www-browser, www-browser
Breaks: firefox-l10n-en-us
Description: The Firefox web browser
 The Mozilla Firefox Web Browser.

$ dpkg -s nedit
dpkg-query: package 'nedit' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.

したがって、そのコマンドを使用して、パッケージがインストールされているかどうかを確認できます。

#!/usr/bin/env bash

run_install()
{
    ## Prompt the user 
    read -p "Do you want to install missing libraries? [Y/n]: " answer
    ## Set the default value if no answer was given
    answer=${answer:Y}
    ## If the answer matches y or Y, install
    [[ $answer =~ [Yy] ]] && apt-get install ${boostlibnames[@]}
}

boostlibnames=("libboost-serialization1.55.0" "libboost-thread1.55.0"
                "libboost-date-time1.55.0" "libboost-signals1.55.0" "nedit")
## Run the run_install function if sany of the libraries are missing
dpkg -s "${boostlibnames[@]}" >/dev/null 2>&1 || run_install

結果を保存する簡単な方法はありますか?例えば。C / C ++では私がやりますinstalled = installed || isInstalled(libArray[i])。同様に、1つ以上がインストールされていない場合は、変数にfalseを設定します。私はでこれを行うことができると思いますifが、それは何の役にも立たない多くのコードです。
トマーシュZato -復活モニカ

@TomášZatoはい。ただし、より具体的にする必要があります。不足しているライブラリのリストを保存しますか?1つで十分ですか?個人的には、すべてがインストールされているかどうかを確認し、少なくとも1つがインストールされていない場合はapt-get install、それらすべてで実行します。インストールされているものはすべて無視されます。何が欲しいか教えてください、これを編集します。基本的に、あなたは変更する必要があります|| echo ...する|| installed=1か何か。
terdon

私はあなたがしていることを正確にしたかったのですが、欠けているライブラリのリストを保存するのは無駄な努力です。すべてを確認し、不足しているものがある場合は、apt-getを実行するようユーザーに求めます。私はすでに醜いifステートメントでコードを機能させていますが、変数が優先されます。関数にラップする予定です。
トマーシュZato -復活モニカ

@TomášZatoOK、更新された回答を見てください。dpkg -s一度に複数のパッケージをチェックできるため、少し簡略化しました。
terdon

1

今日、CentOSシステムでこの機能を実行しました。

#!/bin/bash

# List of the packages that should be present
list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")

# Check for the existence of the packages in the system and print to file.txt the packages to be installed
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { print $2}' > list.txt)

# Check if the list.txt is empty
grep -q '[^[:space:]]' < list.txt
EMPTY_FILE=$?
# If list.txt is empty there's nothing to do
if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

# If list.txt is not empty it installs the packages in list.txt

for PACKAGES in `cat /your/path/list.txt`; do

  yum install -y $PACKAGES

done

fi

さて、関数を少し変更しました。より速く、ループはもう必要ありません。

#!/bin/bash


list=("vim-enhanced" "nano" "expect" "dialog" "epel-release" "yum-utils" "bind-utils")
check_list=$(rpm -q "${list[@]}" | grep -e "not installed" | awk 'BEGIN { FS = " " } ; { printf $2" "}' > /your/path/to/list.txt)
install=$(cat /your/path/to/list.txt)

grep -q '[^[:space:]]' < /your/path/to/list.txt

EMPTY_FILE=$?

if [[ $EMPTY_FILE -eq 1 ]]; then

echo "Nothing to do"

else

yum install -y $install

fi

Debian / Ubuntu版:

apt -qq YOUR_LIST_GOES_HERE | grep -v "installed" | awk -F/ '{print $1}' > /your/path/to/list.txt
packages=$(cat /your/path/to/list.txt)
grep -q '[^[:space:]]' < /your/path/to/list.txt
EMPTY_FILE=$?
if [[ $EMPTY_FILE -eq 1 ]]; then
echo "Nothing to do"
else
apt-get  install -y $packages
fi

0

以下は、インストールされていないすべての関連パッケージのリストです。

dpkg -l $boostlibnames 2>&1 | awk '{if (/^D|^\||^\+/) {next} else if(/^dpkg-query:/) { print $6} else if(!/^[hi]i/) {print $2}}' 

これによりdpkg -l、のヘッダー行がスキップされ、不明なパッケージについてdpkg-queryが文句を言う行と、または(InstのインストールまたはInstのインストール)で始まっていない行が出力されます。hiii

通常、私はのようなヘッダー行を取り除くために、awk 'NR<=5 {next} ; ...'またはのようなことをしますが、この場合、による出力と同様に苦情をキャッチするためにstderrをstdoutにリダイレクトしているため、最初の行を単純に削除することはできません5行。sed -e '1,5d'dpkg -ldpkg-querydpkg -l

これにより、インストール、削除、パージされたことがないパッケージ、またはエラーが原因でインストールが失敗したか部分的に完了したパッケージが表示されます。


0

私はEasy Bashと呼ばれる私の仕事で次のコードを使用します。これは、最も人気のあるパッケージをUbuntuサーバーにすばやくインストールするのに役立ちます。このコードは、リストされたパッケージがインストールされているかどうかをチェックします。

#!/usr/bin/env bash

packages=("curl" "gnupg2" "ca-certificates" "lsb-release")

for pkg in ${packages[@]}; do

    is_pkg_installed=$(dpkg-query -W --showformat='${Status}\n' ${pkg} | grep "install ok installed")

    if [ "${is_pkg_installed}" == "install ok installed" ]; then
        echo ${pkg} is installed.
    fi
done

結果:

ここに画像の説明を入力してください


サイトへようこそ、そしてあなたの貢献に感謝します。それでも、コンソール出力のスクリーンショットを投稿することは避け、代わりに適切なフォーマットでコピーアンドペーストしてください...
AdminBee

-1
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi

問題は、単一のパッケージがすでにインストールされているかどうかを確認することではありませんでした
guntbert 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.