Script untuk memeriksa apakah beberapa program sudah diinstal


11

Bagaimana saya bisa membuat skrip bash yang memeriksa apakah suatu program sudah diinstal, dan jika tidak, instal?

Terima kasih atas bantuan Anda.

Inilah kode yang saya miliki sejauh ini:

#/bin/bash

PS3="choose an option"

select opcion in "Installing_Youtube"  "exit"

do

    case $opcion in


        "Installing_Youtube")

            youtube-dl > /usr/bin
            if [ $? -eq 127 ] ; then
                echo "installing youtube"
                 apt-get update
                 apt-get install youtube-dl
                mkdir Videos
            else
                echo "Youtube already installed"
            fi

        ;;


        "exit")
            exit

10
Apakah Anda bermaksud menimpa /usr/bin?
D. Ben Knoble

1
Apakah Anda membedakan antara nama paket, dan nama file yang dapat dieksekusi? Atau ingin memeriksa keduanya? Hanya jawaban George saat ini yang memeriksa executable
Xen2050

Mengapa Anda ingin memeriksanya? Apa tujuan penggunaan skrip ini?
Braiam

@Braiam Setidaknya dengan apt, menginstal paket yang sudah diinstal akan mengubah statusnya dari otomatis ke manual jika hanya diinstal sebagai dependensi dari paket lain. Jika paket lain dihapus kemudian, paket ini tidak lagi ditandai untuk dihapus secara otomatis. Saya memiliki skrip untuk menginstal daftar paket yang sudah diedit dari instalasi sebelumnya ke yang baru. Teknik ini mencegahnya mengacaukan sistem baru.
Joe

@ Jo yang merupakan solusi buruk. Anda seharusnya hanya mendapatkan daftar paket yang diinstal dengan apt-mark showmanualkemudian menginstal dengan sesuatu seperti apt-get install "$(< package.list)".
Braiam

Jawaban:


11

kamu bisa melakukan ini:

dpkg -s <packagename> &> /dev/null

kemudian periksa status keluar. hanya jika status keluar dari perintah di atas sama dengan 0paket yang diinstal .

begitu:

   #!/bin/bash

    echo "enter your package name"
    read name

    dpkg -s $name &> /dev/null  

    if [ $? -ne 0 ]

        then
            echo "not installed"  
            sudo apt-get update
            sudo apt-get install $name

        else
            echo    "installed"
    fi

Kecuali tidak? Apa yang terjadi dengan garis itu sudo apt install $name? Perintah harus dilanjutkan ke baris berikutnya ... Kalau tidak, kerja bagus ...
Zanna

3
Perhatikan bahwa perangkat lunak dapat diinstal dalam berbagai cara, dan dpkghanya relevan untuk paket debian yang diinstal. Dalam kasus khusus OP, youtube-dlmisalnya dapat juga diinstal melalui manajer paket pythonpip
Sergiy Kolodyazhnyy

2
Mengapa tidak if dpkg -s “$name” &> /dev/null ; then? Efek yang sama, pembersih / imo yang lebih jelas.
D. Ben Knoble

memang, memeriksa status keluar adalah persis apa yang ifdilakukannya ...
Zanna

4

Inilah fungsi yang saya tulis untuk tujuan yang saya gunakan dalam skrip saya. Itu memeriksa untuk melihat apakah paket yang diperlukan diinstal dan jika tidak, meminta pengguna untuk menginstalnya. Ini membutuhkan nama paket sebagai parameter. Jika Anda tidak tahu nama paket yang dimiliki oleh suatu program, Anda dapat mencarinya. Informasi tentang itu tersedia di sini.

function getreq {
dpkg-query --show  "$1"
if [ "$?" = "0" ];
then
    echo "$1" found
else
    echo "$1" not found. Please approve installation.
    sudo apt-get install "$1"
    if [ "$?" = "0" ];
    then echo "$1" installed successfully.
    fi
fi
}

3

Baris perintah ini akan memeriksa menggunakan whichprogram dan akan kembali 0jika diinstal dan 1jika tidak:

which apache | grep -o apache > /dev/null &&  echo 0 || echo 1

Tentu saja Anda akan menggunakannya dengan cara ini dalam skrip Anda:

which "$1" | grep -o "$1" > /dev/null &&  echo "Installed!" || echo "Not Installed!"

Penggunaan sederhana adalah:

#!/usr/bin/env bash
set -e

function checker() { 
        which "$1" | grep -o "$1" > /dev/null &&  return 0 || return 1 
}

if checker "$1" == 0 ; then echo "Installed"; else echo "Not Installed!"; fi

Perhatikan beberapa hal:

  1. Anda harus berurusan dengan masalah dependenciy saat menginstal
  2. Untuk menghindari interaksi dengan skrip selama instalasi lihat di sini untuk contoh.
  3. Anda dapat menangkap nilai kembali dari fungsi itu dan menggunakannya untuk memutuskan apakah akan menginstal atau tidak.

whichsuper non-portabel. Saya sering menggunakan command -vsebagai gantinya, tetapi sangat bergantung pada jenis nama yang Anda cari (alias, fungsi, dapat dieksekusi, & c.)
D. Ben Knoble

Super non-portabel untuk pertanyaan yang ditujukan untuk mesin Ubuntu? Ini bukan Unix & Linuxsitus! Jika saya menjawabnya di Unix & Linuxsitus itu akan menjadi masalah yang berbeda!
George Udosen

3

Mengapa Anda ingin memeriksanya? Kecuali Anda memiliki alasan yang kuat untuk itu, jangan lakukan itu, apt-get install packageselesai saja . Jika sudah terinstal maka akan diperbarui jika ada versi yang lebih baru, jika sudah diinstal dan up to date, tidak akan terjadi apa-apa. Jika Anda memiliki beberapa konfigurasi yang perlu diterapkan, ada opsi lain, seperti membangun paket konfigurasi yang tergantung pada paket atau menggunakan perangkat lunak manajemen konfigurasi seperti mungkin.


1
Sesuatu akan sering terjadi: Setidaknya dengan apt, menginstal paket yang sudah diinstal akan mengubah statusnya dari otomatis ke manual jika hanya diinstal sebagai dependensi dari paket lain. Jika paket lain dihapus kemudian, paket ini tidak lagi ditandai untuk dihapus secara otomatis. Saya memiliki skrip untuk menginstal daftar paket yang sudah diedit dari instalasi sebelumnya ke yang baru. Teknik ini mencegahnya mengacaukan sistem baru.
Joe

2

Satu cara mudah untuk memeriksa paket yang diinstal menggunakan apt-mark:

apt-mark showinstallakan mencantumkan semua paket yang ditandai instal (sudah diinstal, atau antri untuk instalasi). Setelah itu, hanya masalah memahami paket yang Anda pedulikan.

Contoh: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


Anda berada di jalur yang benar! Cukup ubah ke ini untuk menghilangkan kesalahan positif: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "diinstal" || gema "tidak"
Eric Mintz

@EricMintz - terima kasih atas peningkatannya! Diedit.
user535733
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.