dpkg-query
seperti pada posting Anda yang terhubung tampaknya menjadi alat yang paling tepat untuk pekerjaan itu, kecuali menggunakan misalnya pustaka Python yang tersedia untuk mengikat langsung ke sistem APT dalam konteks scripting seperti itu.
Dengan dpkg-query
:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Akan mengembalikan true (status keluar 0
dalam skrip shell) jika paket diinstal, false (status keluar 1
) sebaliknya.
-W
berarti "Tunjukkan" ( dpkg-query
harus memiliki tindakan yang diminta).
-f
mengubah format output.
db:Status-abbrev
adalah bentuk singkat dari status paket.
2>/dev/null
hening dpkg-query
jika nama paket tidak valid diberikan. Bagaimana ini harus ditangani bisa menjadi masalah kasus per kasus.
grep -q
mengembalikan true jika ada kecocokan, false sebaliknya.
Jika sering digunakan, itu bisa dibuat fungsi sederhana:
#!/bin/sh
debInst() {
dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}
if debInst "$1"; then
printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi
atau hanya sederhana
#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi
dpkg-query -l "$package" | grep -q ^.i
biasanya cukup (dan lebih mudah diingat).dpkg-query -l
output tidak disetel karena ini hanya mode presentasi pengguna, jadi jika presentasi berubah mungkin skrip seperti itu akan rusak.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'
dengan efek yang sama.Saya menguji saran Daniel pada tiga paket dengan hasil ini:
Paket repositori Native Debian tidak diinstal:
Paket PPA terdaftar di host dan diinstal:
Paket PPA terdaftar di host tetapi tidak diinstal:
Meskipun saya suka pendekatannya, sepertinya saya tidak bisa mempercayai kode kembali dengan paket PPA. Singkatnya, saya pikir saya akan tetap dengan parsing kembalinya
apt-cache policy
perintah.sumber
grep
bagian dalam menempelkan Anda. Saya tidak dapat mereproduksi masalah Anda, tapi itu mungkin karena contoh kode saat ini tidak lengkap, jadi tolong perbaiki itu. Apakah Anda menjalankan Debian atau Ubuntu?grep
dimainkan dalam perintah, jadi Anda melepaskannya, dan sekarang Anda mengatakan itu tidak berhasil?grep -q
memberikan kode pengembalian1
jika tidak cocok, yaitu program tidak diinstal atau tidak tersedia, atau0
jika program diinstal. Saya menjelaskan hal itu di posting saya.sumber
DEPS=$(echo {dialog,sqlite3,openssh-client})
dapat ditulis secara setara sebagai adilDEPS="dialog sqlite3 openssh-client"
.Saya suka jawaban Daniel Andersson, tetapi itu tidak berhasil untuk saya. Saya di Ubuntu 12,04.
Dari halaman manual dpkg ,
db:Status-abbrev
hanya berfungsi di dpkg 1.16.2+:Solusi saya adalah menggunakan perilaku lawas, hanya
Status
formatter:output
Saya menduga ini adalah inspirasi untuk "ii" di representasi lain.
Jadi, untuk sepenuhnya mengadaptasi jawaban Daniel Andersson untuk bekerja pada versi dpkg yang lebih lama, dan dengan demikian distro Ubuntu yang lebih tua:
Pengembalian:
sumber