Script để kiểm tra nếu một số chương trình đã được cài đặt


11

Làm cách nào tôi có thể tạo tập lệnh bash để kiểm tra xem chương trình đã được cài đặt chưa và nếu không, hãy cài đặt nó?

Cảm ơn bạn đã giúp đỡ.

Đây là mã tôi có cho đến nay:

#/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
Bạn có ý định ghi đè /usr/bin?
D. Ben Knoble

1
Bạn có phân biệt giữa tên gói và tên tệp thực thi không? Hay muốn kiểm tra cả hai? Chỉ có câu trả lời của George hiện đang kiểm tra các tệp thực thi
Xen2050

Tại sao bạn muốn kiểm tra nó? Việc sử dụng mục đích của kịch bản này là gì?
Braiam

@Braiam Ít nhất là với apt, việc cài đặt gói đã cài đặt sẽ thay đổi trạng thái từ tự động sang thủ công nếu nó chỉ được cài đặt dưới dạng phụ thuộc của gói khác. Nếu gói khác đó bị xóa sau đó, gói này sẽ không còn được đánh dấu để tự động xóa. Tôi có một kịch bản để cài đặt một danh sách các gói đã chỉnh sửa từ cài đặt trước vào một gói mới. Kỹ thuật này giữ cho nó khỏi làm lộn xộn hệ thống mới.
Joe

@Joe đó là một giải pháp tồi. Thay vào đó, bạn chỉ nên lấy danh sách các gói đã cài đặt và apt-mark showmanualsau đó cài đặt với một cái gì đó như apt-get install "$(< package.list)".
Braiam

Câu trả lời:


11

bạn có thể làm được việc này:

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

sau đó kiểm tra trạng thái thoát. chỉ khi trạng thái thoát của lệnh trên là tương đương với 0sau đó gói cài đặt .

vì thế:

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

Ngoại trừ nó không? Điều gì đã xảy ra với dòng với sudo apt install $name? Lệnh cần phải đi trên dòng tiếp theo ... Nếu không, công việc tốt ...
Zanna

3
Lưu ý rằng phần mềm có thể được cài đặt theo nhiều cách khác nhau và dpkgchỉ liên quan đến các gói debian được cài đặt. Trong trường hợp cụ thể của OP, youtube-dlchẳng hạn, cũng có thể được cài đặt thông qua trình quản lý gói của pythonpip
Sergiy Kolodyazhnyy

2
Tại sao không if dpkg -s “$name” &> /dev/null ; then? Hiệu ứng tương tự, imo sạch hơn / rõ ràng hơn.
D. Ben Knoble

trên thực tế, kiểm tra tình trạng thoát là chính xác những gì ifkhông ...
Zanna

4

Đây là một chức năng tôi đã viết cho mục đích mà tôi sử dụng trong các tập lệnh của mình. Nó kiểm tra xem gói yêu cầu đã được cài đặt chưa và nếu không, sẽ nhắc người dùng cài đặt nó. Nó đòi hỏi một tên gói như là một tham số. Nếu bạn không biết tên của gói, chương trình bắt buộc thuộc về bạn có thể tra cứu nó. Thông tin về có sẵn ở đây.

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

Dòng lệnh này sẽ kiểm tra bằng whichchương trình và sẽ trả về 0nếu được cài đặt và 1nếu không:

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

Tất nhiên bạn sẽ sử dụng nó theo cách này trong kịch bản của bạn:

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

Một cách sử dụng đơn giản sẽ là:

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

Lưu ý một số điều:

  1. Bạn sẽ phải đối phó với các vấn đề phụ thuộc trong khi cài đặt
  2. Để tránh tương tác với tập lệnh trong khi cài đặt, xem ở đây để biết ví dụ.
  3. Bạn có thể bắt các giá trị trả về từ hàm đó sử dụng nó để quyết định có cài đặt hay không.

whichlà siêu không di động. Tôi thường xuyên sử dụng command -vthay thế, nhưng nó phụ thuộc rất nhiều vào loại tên bạn đang tìm kiếm (bí danh, chức năng, có thể thực thi, & c.)
D. Ben Knoble 23/12/18

Siêu không di động cho một câu hỏi dành cho máy Ubuntu? Đây không phải là Unix & Linuxtrang web! Nếu tôi trả lời nó trên Unix & Linuxtrang web thì đó sẽ là một vấn đề khác!
George Udosen

3

Tại sao bạn muốn kiểm tra nó ở nơi đầu tiên? Trừ khi bạn có một lý do chính đáng cho nó, đừng làm điều đó, chỉ apt-get install packagehơn. Nếu nó đã được cài đặt, nó sẽ được cập nhật nếu có sẵn phiên bản mới hơn, nếu nó được cài đặt và nó được cập nhật, sẽ không có gì xảy ra. Trong trường hợp bạn có một số cấu hình cần được áp dụng, có các tùy chọn khác, như xây dựng gói cấu hình phụ thuộc vào gói hoặc sử dụng phần mềm quản lý cấu hình như ansible.


1
Một cái gì đó sẽ thường xảy ra: Ít nhất là với apt, cài đặt gói đã cài đặt sẽ thay đổi trạng thái từ tự động sang thủ công nếu nó chỉ được cài đặt như một phụ thuộc của gói khác. Nếu gói khác đó bị xóa sau đó, gói này sẽ không còn được đánh dấu để tự động xóa. Tôi có một kịch bản để cài đặt một danh sách các gói đã chỉnh sửa từ cài đặt trước vào một gói mới. Kỹ thuật này giữ cho nó khỏi làm lộn xộn hệ thống mới.
Joe

2

Một cách dễ dàng để kiểm tra các gói đã cài đặt bằng cách sử dụng apt-mark:

apt-mark showinstallsẽ liệt kê tất cả các gói được đánh dấu cài đặt (đã được cài đặt hoặc xếp hàng để cài đặt). Sau đó, đó là một vấn đề đơn giản để gặt hái (các) gói bạn quan tâm.

Thí dụ: apt-mark showinstall | grep -q "^$PACKAGE_NAME$" && echo "installed" || echo "not"


Bạn đang đi đúng hướng! Chỉ cần thay đổi nó thành cái này để loại bỏ các lỗi tích cực: apt-mark showinstall | grep -q "^ $ PACKAGE_NAME $" && echo "đã cài đặt" || tiếng vang "không"
Eric Mintz

@EricMintz - cảm ơn vì sự cải tiến! Đã chỉnh sửa.
dùng535733
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.