私は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
を使用することもできます。
dpkg-query -l <packagename>
command
を所有しているパッケージを見つけるには、次を試してください。
dpkg -S `which <command>`
詳細については、記事Linuxにパッケージがインストールされているかどうかを調べるおよび dpkgチートシート 。
もう少し明確にするために、パッケージをチェックして必要に応じてインストールする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」の呼び出しに置き換えることができます。
この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
Ubuntuがこの質問に答えたとおりに「Personal Package Archive」(PPA)を追加し、PPAパッケージの結果が異なるため、このアップデートを提供します。
ネイティブDebianリポジトリパッケージがインストールされていません:
~$ dpkg-query -l Apache-Perl
~$ echo $?
1
ホストに登録され、インストールされているPPAパッケージ:
~$ dpkg-query -l libreoffice
~$ echo $?
0
ホストに登録されているがインストールされていない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
こちらもご覧ください:
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>
私にとってはうまくいく...
これはかなりうまくいくようです。
$ 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$'
これにより、最終的なinstalledまたはnot-installedになります
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
を発行していません。安定していると予想される自動化されたプロセスにはあまり良いアイデアではありません。
$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
この機能はcommand-not-found
パッケージのUbuntuおよびDebianにすでに存在します。
which <command>
if [ $? == 1 ]; then
<pkg-manager> -y install <command>
fi
apt list [packagename]
dpkgや古いapt- *ツール以外で行う最も簡単な方法のようです
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を非常に静かにします。
テストを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ファイルが新しいバージョンである場合、現在インストールされているパッケージが上書きされないことです。
最近のapt-get
には、OPが望んでいることを行うオプション--no-upgrade
があります:
--no-upgrade
パッケージをアップグレードしません。インストールと組み合わせて使用すると、no-upgradeは、リストされているパッケージが既にインストールされている場合、アップグレードされないようにします。
https://linux.die.net/man/8/apt-get からのマンページ
したがって、使用できます
apt-get install --no-upgrade package
package
は、インストールされていない場合にのみインストールされます。
多くのことが語られていますが、私にとって最も簡単な方法は次のとおりです。
dpkg -l | grep packagename
私は次の方法を使用します:
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
Bashの場合:
PKG="emacs"
dpkg-query -l $PKG > /dev/null || Sudo apt install $PKG
PKGのいくつかのパッケージで文字列を使用できることに注意してください。
このコマンドは最も印象的です:
dpkg --get-selections <package-name>
インストールされている場合は、印刷されます:
<パッケージ名>インストール
それ以外の場合は印刷されます
<パッケージ名>に一致するパッケージは見つかりませんでした。
これは、Ubuntu 12.04.1(Precise Pangolin)でテストされました。