Xác định người quản lý gói hệ thống


12

Có cách nào (từ một tập lệnh) để xác định trình quản lý gói hệ thống mặc định không?

Để làm rõ, những gì tôi muốn làm là chạy một lệnh đã cho và trên Debian hoặc bất kỳ dẫn xuất nào của nó, nó sẽ trả về một cái gì đó như "apt", trên openSUSE, nó sẽ trả về "zypp", trên Fedora et al, nó sẽ trả về "yum", trên Arch Linux, nó sẽ trả về "pacman", v.v.

Tôi biết tôi có thể làm điều này với một cái gì đó như sau, tôi chỉ tự hỏi liệu có một phương pháp mạnh mẽ hơn sẽ không bị phá vỡ ngay khi có một thực thi có cùng tên.

which apt >/dev/null 2>&1
if [ $? -eq 0 ]
then
    echo "apt"
fi
# etc...

Câu trả lời:


9

Bắt đầu với câu trả lời được chấp nhận cho câu hỏi này: Làm cách nào tôi có thể nhận được tên phân phối và số phiên bản trong tập lệnh shell đơn giản? . Sau đó, quyết định trình quản lý gói nào bạn muốn sử dụng dựa trên phân phối được phát hiện.


Có một danh sách sẵn có của các nhà quản lý gói cho các bản phân phối khác nhau không? Có rất nhiều bản sao debian nói riêng.
DrAl

Không chắc chắn về một danh sách có sẵn, nhưng tất cả các bản sao Debian sẽ sử dụng apt-get.
Jim Paris

Vâng, tôi nhận ra rằng; vấn đề của tôi không phải là quá nhiều trong việc xác định phân phối (mặc dù liên kết của bạn chắc chắn sẽ giúp việc này dễ dàng hơn), nhưng nó tìm ra cách liên kết một tên phân phối như (để chọn một cách ngẫu nhiên) "SolusOS" với apt mà không cần duy trì danh sách mọi phân phối tồn tại
DrAl

Thực hiện theo cách tự động: Kiểm tra nếu nó hoạt động. BTW, phân phối sử dụng apt có nghĩa là nó là họ hàng của Debian (và chúng là một bó khá nhỏ gọn), việc tìm kiếm không có nghĩa là các quy ước đóng gói (tách thành thư viện / phát triển, một khối lớn của Perl hoặc các gói riêng lẻ CPAN, ...) đều giống nhau. Thậm chí đừng thử cài đặt gói Fedora trên CentOS (có ít nhất 3 hoặc 4 năm phiên bản bị lệch, chỉ không hoạt động).
vonbrand

Phát hiện các bản phân phối sẽ chỉ làm việc cho những người phổ biến. Danh sách trắng không thể được cập nhật cho tất cả các bản phân phối ít biết. Kiểm tra trực tiếp sự hiện diện của các công cụ là cách duy nhất để làm cho nó hoạt động. Nếu nó trông giống như một con vịt, bơi như một con vịt và quạ giống như một con vịt, thì đó có lẽ là một con vịt.
lực lượng tự do

8

Thay vì xác định chương trình nhị phân, bạn nên bắt đầu từ xác định phân phối,

Chỉ cần cung cấp cho bạn một vài dòng hoạt động trong kịch bản bash:

declare -A osInfo;
osInfo[/etc/redhat-release]=yum
osInfo[/etc/arch-release]=pacman
osInfo[/etc/gentoo-release]=emerge
osInfo[/etc/SuSE-release]=zypp
osInfo[/etc/debian_version]=apt-get

for f in ${!osInfo[@]}
do
    if [[ -f $f ]];then
        echo Package manager: ${osInfo[$f]}
    fi
done

Không thể tin tưởng những phần này, nhưng nhìn chung mọi người sẽ không làm điều đó.


1

Tôi đã chọn đi con đường này sau khi xem xét những người khác. Điều này xuất hiện với tôi khi chạy nhiều container docker và cần curl / jq và không thể dựa vào những gì có sẵn từ công việc này đến công việc khác.

script:
 - if [ -x "$(command -v apk)" ]; then apk add --no-cache curl jq; fi
 - if [ -x "$(command -v apt-get)" ]; then apt-get install curl jq; fi
 - if [ -x "$(command -v dnf)" ]; then dnf install curl jq; fi
 - if [ -x "$(command -v zypper)" ]; then zypper install curl jq; fi
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.