Saya sedang mengerjakan sistem Ubuntu dan saat ini inilah yang saya lakukan:
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
Apakah ini yang akan dilakukan kebanyakan orang? Atau ada solusi yang lebih elegan?
command -v <command>
; tidakwhich <command>
. Lihat juga Periksa apakah ada program dari skrip Bash .Jawaban:
Untuk memeriksa apakah
packagename
sudah diinstal, ketik:Anda juga dapat menggunakan
dpkg-query
yang memiliki output yang lebih rapi untuk tujuan Anda, dan menerima kartu liar juga.Untuk menemukan paket apa yang dimiliki
command
, cobalah:Untuk detail lebih lanjut, lihat artikel Cari tahu apakah paket diinstal di Linux dan lembar cheat dpkg .
sumber
if
penggunaan. Saya juga mencariif
penggunaan.dpkg -s
mengembalikan 1 pada paket yang hilang dan 0 sebaliknya, sebagaimana mestinya. Bagaimana perbedaan pada versi sebelumnya (atau yang terbaru)?dpkg -s
mengembalikan nol jika paket diinstal dan kemudian dihapus - dalam hal iniStatus: deinstall ok config-files
atau serupa, jadi "ok" - jadi bagi saya, ini bukan tes yang aman.dpkg-query -l
tampaknya tidak mengembalikan hasil yang berguna dalam kasus ini.Untuk menjadi sedikit lebih eksplisit, inilah sedikit skrip bash yang memeriksa sebuah paket dan memasangnya jika diperlukan. Tentu saja, Anda dapat melakukan hal-hal lain setelah mengetahui bahwa paket tersebut hilang, seperti hanya keluar dengan kode kesalahan.
Jika skrip berjalan dalam GUI (misalnya skrip Nautilus), Anda mungkin ingin mengganti permintaan 'sudo' dengan yang 'gksudo'.
sumber
--force-yes
sepertinya ide yang buruk. Dari halaman manual: "Ini adalah opsi berbahaya yang akan menyebabkan apt-get untuk melanjutkan tanpa disuruh jika melakukan sesuatu yang berpotensi berbahaya. Ini tidak boleh digunakan kecuali dalam situasi yang sangat khusus. Menggunakan --force-yes berpotensi menghancurkan sistem Anda ! " Menggunakannya dalam skrip membuatnya lebih buruk.One-liner ini mengembalikan 1 (diinstal) atau 0 (tidak diinstal) untuk paket 'nano' ..
bahkan jika paket tidak ada / tidak tersedia.
Contoh di bawah ini menginstal paket 'nano' jika tidak diinstal ..
sumber
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
untuk regex sederhana seperti itu.if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi
- Tidak perlu digunakangrep -c
, cukup gunakan status keluar darigrep
dpkg -s
penggunaan terprogram dengan instalasi otomatisSaya suka
dpkg -s
ketika keluar dengan status1
jika salah satu paket tidak diinstal, membuatnya mudah untuk diotomatisasi:man dpkg
sayangnya tidak mendokumentasikan status keluar, tapi saya pikir seharusnya cukup aman untuk mengandalkannya:Satu hal yang perlu diperhatikan adalah menjalankan:
tidak harus langsung menghapus semua file untuk beberapa paket (tetapi untuk yang lain, tidak yakin mengapa?), dan hanya menandai paket untuk dihapus.
Dalam keadaan ini, paket tampaknya masih dapat digunakan, dan karena file-nya masih ada, tetapi ditandai untuk dihapus nanti.
Misalnya jika Anda menjalankan:
kemudian:
dua
echo $?
output pertama0
, hanya yang ketiga output1
output untuk yang pertama
dpkg -s certbot
berisi:sedangkan yang kedua mengatakan:
dan itu hanya hilang setelah pembersihan:
file
/etc/logrotate.d/certbot
masih ada di sistem setelahapt remove
, tetapi tidak setelah--purge
.Namun, file
/usr/lib/python3/dist-packages/certbot/reporter.py
tersebut tetap ada bahkan setelahnya--purge
.Saya tidak mengerti mengapa, tetapi dengan
hello
paket yang keduadpkg
setelahapt remove
menunjukkan bahwa paket dia telah dihapus tanpa--purge
:Dokumentasi juga sangat tidak jelas, misalnya:
tidak menghapus
certbot
ketika itu ditandaideinstall
, meskipunman apt-get
tampaknya menunjukkan bahwa:Lihat juga:
Diuji pada Ubuntu 19.10.
apt
Paket pythonAda paket Python 3 pra-instal yang disebut
apt
di Ubuntu 18.04 yang memperlihatkan antarmuka Python apt!Sebuah skrip yang memeriksa apakah sebuah paket diinstal dan menginstalnya jika tidak dapat dilihat di: Cara menginstal paket menggunakan API python-apt
Berikut ini adalah salinan untuk referensi:
Periksa apakah executable
PATH
sebagai gantinyaLihat: Bagaimana saya bisa memeriksa apakah ada program dari skrip Bash?
sumber
sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?
. Bisakah Anda memberikan perincian lebih lanjut?Saya menawarkan pembaruan ini karena Ubuntu menambahkan "Personal Package Archive" (PPA) seperti pertanyaan ini dijawab, dan paket PPA memiliki hasil yang berbeda.
Paket repositori Native Debian tidak diinstal:
Paket PPA terdaftar di host dan diinstal:
Paket PPA terdaftar di host tetapi tidak diinstal:
Juga diposting di: /superuser/427318/test-if-a-package-is-installed-in-apt/427898
sumber
UpAndAdam menulis:
Dalam pengalaman saya , Anda dapat mengandalkan kode keluar dkpg.
Kode pengembalian dpkg -s adalah 0 jika paket diinstal dan 1 jika tidak, jadi solusi paling sederhana yang saya temukan adalah:
Bekerja dengan baik untuk saya ...
sumber
apt-get remove <package>
,dpkg -s <package>
masih mengembalikan 0, meskipun paketnya adalahdeinstalled
Ini sepertinya bekerja dengan cukup baik.
0
jika tidak diinstal atau beberapa nomor> 0
jika diinstal.sumber
grep | wc -l
adalah antipattern. Untuk memeriksa apakah ada sesuatu, Anda hanya ingingrep -q
. Untuk benar-benar menghitung kejadian (yang jarang berguna dalam skenario semacam ini), gunakangrep -c
.dpkg -s zip | grep -c "Package: zip"
,? (menggunakan zip sebagai paket sampel)grep -q 'Package: zip'
mengembalikan kode keluar yang menunjukkan apakah hasilnya ditemukan tanpa mencetak apa pun.Saya telah memilih satu berdasarkan jawaban Nultyi :
Pada dasarnya, pesan kesalahan dari
dpkg --get-selections
jauh lebih mudah diurai daripada sebagian besar yang lain, karena tidak termasuk status seperti "deinstall". Ini juga dapat memeriksa beberapa paket secara bersamaan, sesuatu yang tidak dapat Anda lakukan hanya dengan kode kesalahan.Penjelasan / contoh:
Jadi, grep menghapus paket-paket yang terinstal dari daftar, dan awk menarik nama-nama paket dari pesan kesalahan, yang menghasilkan
MISSING='python3-venv python3-dev jq'
, yang dapat dimasukkan secara sepele ke dalam perintah instal.Saya tidak mengeluarkan secara membabi buta
apt-get install $PACKAGES
karena seperti yang disebutkan dalam komentar, ini secara tak terduga dapat meningkatkan paket yang tidak Anda rencanakan; bukan ide yang bagus untuk proses otomatis yang diharapkan stabil.sumber
[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
Saya telah menemukan semua solusi di atas dapat menghasilkan false positive jika suatu paket diinstal dan kemudian dihapus namun paket instalasi tetap pada sistem.
Untuk mereplikasi: Instal paket
apt-get install curl
Hapus paket
apt-get remove curl
Sekarang uji jawaban di atas.
Perintah berikut tampaknya mengatasi kondisi ini:
dpkg-query -W -f='${Status}\n' curl | head -n1 | awk '{print $3;}' | grep -q '^installed$'
Ini akan menghasilkan diinstal definitif atau tidak diinstal
sumber
config-files
- jadi saya pikir final| grep -q "installed"
benar-benar diperlukan untuk mendapatkan status kode keluar fungsional.| grep -q '^installed$'
Tampaknya saat ini
apt-get
memiliki opsi--no-upgrade
yang hanya melakukan apa yang diinginkan OP:Manpage dari https://linux.die.net/man/8/apt-get
Karena itu bisa Anda gunakan
dan
package
akan diinstal hanya jika tidak.sumber
sumber
command -v <command>
; tidakwhich <command>
. Lihat juga Periksa apakah ada program dari skrip Bash .Ini akan melakukannya.
apt-get install
idempoten.sumber
apt-get install
paket tidak diinginkan di mana paket sudah diinstal, meskipun perintah itu sendiri idempoten. Dalam kasus saya, saya menginstal paket pada sistem jarak jauh dengan modul mentah Ansible, yang akan melaporkan sistem sebagai berubah setiap kali jika saya menjalankannyaapt-get install
tanpa pandang bulu. A bersyarat memecahkan masalah itu.Menggunakan:
Jika tidak diinstal, itu akan menunjukkan:
Jika tidak maka akan ditampilkan:
sumber
Fitur ini sudah ada di Ubuntu dan Debian, dalam
command-not-found
paket.sumber
command-not-found
adalah penolong interaktif, bukan alat untuk memastikan Anda memiliki dependensi yang Anda inginkan. Tentu saja, cara yang tepat untuk mendeklarasikan dependensi adalah dengan mengemas perangkat lunak Anda dalam paket Debian dan mengisiDepends:
deklarasi dalam file paketdebian/control
dengan benar.tampaknya menjadi cara paling sederhana untuk melakukannya di luar dpkg dan alat apt * lama
sumber
sumber
command -v <command>
; tidakwhich <command>
. Lihat juga Periksa apakah ada program dari skrip Bash .Saya memiliki persyaratan yang sama ketika menjalankan tes lokal, bukan di buruh pelabuhan. Pada dasarnya saya hanya ingin menginstal file deb yang ditemukan jika belum diinstal.
Saya kira mereka hanya masalah yang bisa saya lihat adalah tidak memeriksa nomor versi paket jadi jika file deb adalah versi yang lebih baru, maka ini tidak akan menimpa paket yang diinstal saat ini.
sumber
Untuk Ubuntu, apt menyediakan cara yang cukup baik untuk melakukan ini. Di bawah ini adalah contoh untuk google chrome:
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
Saya mengarahkan output kesalahan ke nol karena apt memperingatkan untuk tidak menggunakan "cli tidak stabil". Saya menduga paket list sudah stabil jadi saya pikir tidak masalah membuang peringatan ini. -Qq membuat apt super quiet.
sumber
Perintah ini adalah yang paling berkesan:
Jika diinstal, ia akan mencetak:
Kalau tidak mencetak
Ini diuji di Ubuntu 12.04.1 (Precise Pangolin).
sumber
dpkg --get-selections <package-name>
tidak menetapkan kode keluar ke nol ketika paket tidak ditemukan.Banyak hal yang telah diceritakan tetapi bagi saya cara paling sederhana adalah:
sumber
Di Bash:
Perhatikan bahwa Anda dapat memiliki string dengan beberapa paket di PKG.
sumber
Saya menggunakan cara berikut:
sumber