web-dev-qa-db-ja.com

apt-getパッケージがインストールされているかどうかを確認し、Linuxにない場合はインストールしますか?

私はUbuntuシステムで作業していますが、現在これは私がやっていることです:

if ! which command > /dev/null; then
   echo -e "Command not found! Install? (y/n) \c"
   read
   if "$REPLY" = "y"; then
      Sudo apt-get install command
   fi
fi

これはほとんどの人がすることですか?または、よりエレガントなソリューションがありますか?

208
John Jiang

packagenameがインストールされているかどうかを確認するには、次を入力します。

dpkg -s <packagename>

また、目的に合った出力があり、ワイルドカードも受け入れるdpkg-queryを使用することもできます。

dpkg-query -l <packagename>

commandを所有しているパッケージを見つけるには、次を試してください。

dpkg -S `which <command>`

詳細については、記事Linuxにパッケージがインストールされているかどうかを調べるおよび dpkgチートシート

295
Török Gábor

もう少し明確にするために、パッケージをチェックして必要に応じてインストールするbashスクリプトを少し紹介します。もちろん、エラーコードで単純に終了するなど、パッケージが見つからないことがわかったら、他のことを行うことができます。

PKG_OK=$(dpkg-query -W --showformat='${Status}\n' the.package.name|grep "install ok installed")
echo Checking for somelib: $PKG_OK
if [ "" == "$PKG_OK" ]; then
  echo "No somelib. Setting up somelib."
  Sudo apt-get --force-yes --yes install the.package.name
fi

スクリプトがGUI内で実行される場合(例:Nautilusスクリプト)、「Sudo」の呼び出しを「gksudo」の呼び出しに置き換えることができます。

73
Urhixidur

この1ライナーは、「nano」パッケージに対して1(インストール済み)または0(未インストール)を返します。

$(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed")

パッケージが存在しない/利用できない場合でも。

以下の例では、「nano」パッケージがインストールされていない場合にインストールします。

if [ $(dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
  apt-get install nano;
fi
66
Seb

Ubuntuがこの質問に答えたとおりに「Personal Package Archive」(PPA)を追加し、PPAパッケージの結果が異なるため、このアップデートを提供します。

  1. ネイティブDebianリポジトリパッケージがインストールされていません:

    ~$ dpkg-query -l Apache-Perl
    ~$ echo $?
    1
    
  2. ホストに登録され、インストールされているPPAパッケージ:

    ~$ dpkg-query -l libreoffice
    ~$ echo $?
    0
    
  3. ホストに登録されているがインストールされていないPPAパッケージ:

    ~$ dpkg-query -l domy-ce
    ~$ echo $?
    0
    ~$ Sudo apt-get remove domy-ce
    [Sudo] password for user: 
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Package domy-ce is not installed, so not removed
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    

また、投稿: https://superuser.com/questions/427318/test-if-a-package-is-installed-in-apt/427898

11
tahoar

dpkg -sプログラムによる使用法

パッケージのいずれかがインストールされていない場合はステータスがdpkg -sで終了し、自動化が容易になるため、1が好きです。

pkgs='qemu-user pandoc'
if ! dpkg -s $pkgs >/dev/null 2>&1; then
  Sudo apt-get install $pkgs
fi

こちらもご覧ください:

Ubuntu 18.10。でテスト済み。

UpAndAdamの書き込み:

ただし、ここでスクリプトを作成するために単純にリターンコードに依存することはできません。

myを体験してくださいcan dkpgの終了コードに依存しています。

dpkg -sのリターンコードは、パッケージがインストールされている場合はであり、パッケージがインストールされている場合は1そうではないので、私が見つけた最も簡単な解決策は:

dpkg -s <pkg-name> 2>/dev/null >/dev/null || Sudo apt-get -y install <pkg-name>

私にとってはうまくいく...

6
rocka84

これはかなりうまくいくようです。

$ Sudo dpkg-query -l | grep <some_package_name> | wc -l
  • インストールされていない場合は0を返し、インストールされている場合はいくつかの> 0を返します。
6
sandman

パッケージをインストールしてから削除しても、インストールパッケージがシステムに残っている場合、上記のすべてのソリューションで誤検知が発生することがあります。

複製するには:パッケージapt-get install curlをインストールします
パッケージの削除apt-get remove curl

次に、上記の答えをテストします。

次のコマンドはこの状態を解決するようです:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'

これにより、最終的なinstalledまたはnot-installedになります

3
Mark

Nultyiの答え に基づいたものに決めました。

MISSING=$(dpkg --get-selections $PACKAGES 2>&1 | grep -v 'install$' | awk '{ print $6 }')
# Optional check here to skip bothering with apt-get if $MISSING is empty
Sudo apt-get install $MISSING

基本的に、dpkg --get-selectionsからのエラーメッセージは、「削除」などのステータスが含まれていないため、他のほとんどのエラーメッセージよりもはるかに簡単に解析できます。また、複数のパッケージを同時にチェックすることもできますが、これはエラーコードだけではできません。

説明/例:

$ dpkg --get-selections  python3-venv python3-dev screen build-essential jq
dpkg: no packages found matching python3-venv
dpkg: no packages found matching python3-dev
screen                                          install
build-essential                                 install
dpkg: no packages found matching jq

そのため、grepはインストールされたパッケージをリストから削除し、awkはエラーメッセージからパッケージ名を引き出します。その結果、MISSING='python3-venv python3-dev jq'がインストールコマンドに簡単に挿入されます。

コメントで述べたように、これはあなたが計画していなかったパッケージを予期せずアップグレードする可能性があるので、私は盲目的にapt-get install $PACKAGESを発行していません。安定していると予想される自動化されたプロセスにはあまり良いアイデアではありません。

3
Izkata
$name="rsync"

[ `which $name` ] $$ echo "$name : installed" || Sudo apt-get install -y $name
2
Kyprio

これでできます。 apt-get installはべき等です。

Sudo apt-get install command
2
David Baucum

つかいます:

apt-cache policy <package_name>

インストールされていない場合、次のように表示されます。

Installed: none

それ以外の場合:

Installed: version
2

この機能はcommand-not-foundパッケージのUbuntuおよびDebianにすでに存在します。

1
camh
which <command>
if [ $? == 1 ]; then
    <pkg-manager> -y install <command>
fi
1
irock.dev
apt list [packagename]

dpkgや古いapt- *ツール以外で行う最も簡単な方法のようです

1
Erich

Ubuntuの場合、aptはこれを行うためのかなり適切な方法を提供します。以下は、Google Chromeの例です。

apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable

Aptはその「不安定なcli」の使用に対して警告するため、エラー出力をnullにリダイレクトしています。リストパッケージは安定していると思われるので、この警告を捨てても問題ないと思います。 -qqはaptを非常に静かにします。

1
carlin.scott

テストをdockerではなくローカルで実行する場合、同様の要件がありました。基本的に、まだインストールされていない場合に見つかった.debファイルのみをインストールしたかったのです。

# If there are .deb files in the folder, then install them
if [ `ls -1 *.deb 2> /dev/null | wc -l` -gt 0 ]; then
  for file in *.deb; do
    # Only install if not already installed (non-zero exit code)
    dpkg -I ${file} | grep Package: | sed -r 's/ Package:\s+(.*)/\1/g' | xargs dpkg -s
    if [ $? != 0 ]; then
        dpkg -i ${file}
    fi;
  done;
else
  err "No .deb files found in '$PWD'"
fi

私が見ることができる唯一の問題は、パッケージのバージョン番号をチェックしないため、.debファイルが新しいバージョンである場合、現在インストールされているパッケージが上書きされないことです。

1
Craig

最近のapt-getには、OPが望んでいることを行うオプション--no-upgradeがあります:

--no-upgradeパッケージをアップグレードしません。インストールと組み合わせて使用​​すると、no-upgradeは、リストされているパッケージが既にインストールされている場合、アップグレードされないようにします。

https://linux.die.net/man/8/apt-get からのマンページ

したがって、使用できます

apt-get install --no-upgrade package

packageは、インストールされていない場合にのみインストールされます。

0

多くのことが語られていますが、私にとって最も簡単な方法は次のとおりです。

dpkg -l | grep packagename
0
freedev

私は次の方法を使用します:

which mySQL 2>&1|tee 1> /dev/null
  if [[ "$?" == 0 ]]; then
                echo -e "\e[42m MySQL already installed. Moving on...\e[0m"
        else
        Sudo apt-get install -y mysql-server
                if [[ "$?" == 0 ]]; then
                        echo -e "\e[42mMy SQL installed\e[0m"
                else
                        echo -e "\e[42Installation failed\e[0m"
                fi
        fi
0
Nitish Jadia

Bashの場合:

PKG="emacs"
dpkg-query -l $PKG > /dev/null || Sudo apt install $PKG

PKGのいくつかのパッケージで文字列を使用できることに注意してください。

0
daruma

このコマンドは最も印象的です:

dpkg --get-selections <package-name>

インストールされている場合は、印刷されます:

<パッケージ名>インストール

それ以外の場合は印刷されます

<パッケージ名>に一致するパッケージは見つかりませんでした。

これは、Ubuntu 12.04.1(Precise Pangolin)でテストされました。

0
iNulty