チェック場合にはapt-getパッケージがインストールされてとしてインストールインストールするものであれば、これはLinux?

StackOverflow https://stackoverflow.com/questions/1298066

  •  18-09-2019
  •  | 
  •  

質問

私自身は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

これがほとんどの人はいかがですか?それによりエレガント解決するのか

役に立ちましたか?

解決

チェックの場合 packagename インストールしたタイプ:

dpkg -s <packagename>

も利用できます dpkg-query とneater出力お客様の特定の目的のために、受け入れとワイルドカードです。

dpkg-query -l <packagename>

見どのようなパッケージを所有して command, み:

dpkg -S `which <command>`

詳しくは、第 ただパッケージがインストールされてLinuxでは、controlelrディレクトリにて翻訳チートシート.

他のヒント

もう少し明確にするために、ここではパッケージをチェックし、必要であれば、それをインストールする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
スクリプトが(例えば、それはNautilusのスクリプトです)GUI内で実行される場合は、

、あなたはおそらく「gksudo」1で「sudo」を呼び出しを交換したいと思うでしょう。

このワンライナーは1(インストール)又は 'ナノ' パッケージで0(インストールされていない)..

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

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

それがインストールされていない場合は、

の例では、以下の「ナノ」パッケージをインストールします..

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

私はこの更新以降、Ubuntuの追加、"個人のパッケージアーカイブ"(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

dpkg -s プの使用

私のように dpkg -s で終了ステータス 1 る場合は、パッケージが入っていないが容易で自動化す:

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

man dpkg ない文書の終了ステータスがないと思うので合理的に安全で信頼で

-s, --status package-name...
    Report status of specified package.

参照:

試Ubuntu18.10.

UpAndAdam書き:

しかしない単純なコードを返しこのスクリプティング

体験す ができ なdkpgの口コードです。

のリターン-コードの dpkg-s0 の場合はパッケージがインストールされて、 1 いない場合は、最も単純な解決の見した:

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

動作っていただき---

このう(笑)。

$ sudo dpkg-query -l | grep <some_package_name> | wc -l
  • でのいずれかを返します 0 させないもの又は番号 > 0 インストールされた場合、.

私はパッケージがインストールしてからインストール・パッケージがシステムに残っまだ削除された場合、上記のすべてのソリューションは、偽陽性を作り出すことができることがわかりました。

複製するには: パッケージapt-get install curlをインストール

パッケージapt-get remove curlを削除

今の答え上記のテストます。

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

これは決定的になります インストールまたはインストールされていない

私は Nultyiの答えに基づいて1に定住しました。

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
それは「deinstallと」などのステータスが含まれていないため、

基本的には、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は自明installコマンドに挿入することができMISSING='python3-venv python3-dev jq'その結果、エラーメッセージ、から外にパッケージ名を引っ張るようにします。

コメントで述べたように、これは予想外にあなたが計画されていないパッケージをアップグレードすることができますので、

私は盲目的にapt-get install $PACKAGESを発行していませんよ。安定していることが期待されている自動化されたプロセスのためではない、本当に良いアイデアます。

$name="rsync"

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

このはそれを行います。 apt-get installは冪等である。

sudo apt-get install command

使用します。

apt-cache policy <package_name>

それがインストールされていない場合は、それが表示されます:

Installed: none

それ以外の場合は、表示されます:

Installed: version

この機能を既存のUbuntuおよびDebianで、 command-not-found パッケージです。

apt list [packagename]

dpkgのと古いAPT-*ツール

の外にそれを行うための最も簡単な方法のようです
which <command>
if [ $? == 1 ]; then
    <pkg-manager> -y install <command>
fi
ドッキングウィンドウでなく、ローカルのテストを実行するときに

私は、同様の要件を持っていました。基本的に私は、彼らが既にインストールされていなかった場合は見つかったの.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ファイルが新しいバージョンである場合、これは現在インストールされているパッケージを上書きしないように、それは、パッケージのバージョン番号を確認しないことです。

推測します

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のスーパー静かになります。

このコマンドは、最も記憶に残るです。

dpkg --get-selections <package-name>

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

  

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

それ以外の場合は、印刷します。

  

いいえパッケージが一致が見つかりませんでした。<パッケージ名>。

これはUbuntuの12.04.1(精密センザンコウ)で試験した。

多くの事が言われているが、私のために最も簡単な方法はあります:

dpkg -l | grep packagename

bashでます:

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

あなたはPKG内のいくつかのパッケージの文字列を持つことができることに注意してください。

私は、以下の方法を使用します:

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

この現在 apt-get オプション --no-upgrade るだけでは何のOPい:

--no-upgrade なアップパッケージ。る場合には当社までお問い合わせをインストールし、無ッ防止パッケージで提供されているアについて既存の装置です。

Manpageから https://linux.die.net/man/8/apt-get

してお使いいただけます。

apt-get install --no-upgrade package

package 設置されていない場合にのみとなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top