Сценарій, щоб перевірити, чи якась програма вже встановлена


11

Як я можу створити bash-скрипт, який перевіряє, чи програма вже встановлена, а якщо її немає, її встановлює?

Спасибі за вашу допомогу.

Ось код у мене поки що:

#/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
Ви маєте намір перезаписати /usr/bin?
D. Ben Knoble

1
Ви розрізняєте назви пакетів та виконавчі назви файлів? Або хочете перевірити обидва? Тільки відповідь Джорджа в даний час перевіряє виконувані файли
Xen2050

Чому ти хочеш це перевірити? Яке цільове використання цього сценарію?
Брайам

@Braiam Принаймні з apt, встановлення вже встановленого пакету змінить його стан з автоматичного на ручне, якщо він був встановлений лише як залежність від іншого пакету. Якщо інший пакет згодом буде видалено, цей пакет більше не буде позначено для автоматичного видалення. У мене є сценарій для встановлення відредагованого списку пакунків з попередньої установки в новий. Ця техніка не дає їй заплутати нову систему.
Джо

@Joe, це погане рішення. Натомість слід просто отримати список встановлених пакетів, а apt-mark showmanualпотім встановити щось подібне apt-get install "$(< package.list)".
Брайам

Відповіді:


11

Ви можете це зробити:

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

потім перевірити стан виходу. тільки якщо статус виходу з вищевказаної команди був рівним 0встановленому пакету .

тому:

   #!/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

За винятком цього немає? Що сталося з лінією sudo apt install $name? Команді потрібно перейти на наступний рядок ... Інакше гарна робота ...
Zanna

3
Зауважте, що програмне забезпечення можна встановлювати різними способами, і dpkgвоно актуально лише для встановлених пакунків debian. Наприклад, в конкретному випадку ОП youtube-dlможе бути встановлений також через менеджера пакунків pythonpip
Сергій Колодяжний

2
Чому ні if dpkg -s “$name” &> /dev/null ; then? Той самий ефект, чистіший / чіткіший imo.
D. Ben Knoble

Дійсно, перевірка статусу виходу - це саме те, що ifробить ...
Zanna

4

Ось функція, яку я написав для того, який я використовую у своїх сценаріях. Він перевіряє, чи встановлений необхідний пакет, а якщо ні, то спонукає користувача встановити його. Як параметр потрібна назва пакета. Якщо ви не знаєте ім'я пакету, до якого належить потрібна програма, можете переглянути його. Інформація про це доступна тут.

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

Цей рядок команд буде перевіряти за допомогою whichпрограми і повернеться, 0якщо встановлено, а 1якщо ні:

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

Звичайно, ви будете використовувати його таким чином у своєму сценарії:

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

Просте використання буде:

#!/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

Зауважте кілька речей:

  1. Вам доведеться мати справу з проблемами залежностей під час встановлення
  2. Щоб уникнути взаємодії зі сценарієм під час встановлення, дивіться приклади тут .
  3. Ви можете зафіксувати повернені значення з цієї функції та скористатися нею, щоб вирішити, встановити чи ні.

whichє суперпортативним. Я часто використовую command -vнатомість, але це сильно залежить від типу імені, яке ви шукаєте (псевдонім, функція, виконуваний файл і
т.п.

Супер непортативний для питання, що стосується машини Ubuntu? Це не Unix & Linuxсайт! Якби я відповідав на це на Unix & Linuxсайті, це було б іншим питанням!
Джордж Удосен

3

Чому ви хочете перевірити це в першу чергу? Якщо у вас немає вагомих причин для цього, не робіть цього, просто apt-get install packageзакінчіться. Якщо вона вже встановлена, вона буде оновлена, якщо буде доступна нова версія, якщо вона встановлена ​​і вона актуальна, нічого не відбудеться. Якщо у вас є якась конфігурація, яку потрібно застосувати, є й інші параметри, наприклад, створення конфігураційного пакета, який залежить від пакету, або використання програмного забезпечення для управління конфігурацією, як ansible.


1
Щось часто траплятиметься: принаймні, за допомогою apt, встановлення вже встановленого пакету змінить його стан з автоматичного на ручне, якщо він був встановлений лише як залежність іншого пакету. Якщо інший пакет згодом буде видалено, цей пакет більше не буде позначено для автоматичного видалення. У мене є сценарій для встановлення відредагованого списку пакунків з попередньої установки в новий. Ця техніка не дає їй заплутати нову систему.
Джо

2

Один простий спосіб перевірити наявність встановлених пакетів за допомогою apt-mark:

apt-mark showinstallперерахує всі пакунки, позначені встановити (вже встановлені, або в черзі для встановлення). Після цього просте запитання пакунків, які вам цікаві.

Приклад: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


Ви на правильному шляху! Просто змініть його на це, щоб усунути помилкові позитиви: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "встановлено" || відлуння "не"
Ерік Мінц

@EricMintz - дякую за покращення! Відредаговано.
user535733
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.