การระบุตัวจัดการแพ็คเกจระบบ


12

มีวิธี (จากสคริปต์) เพื่อระบุตัวจัดการแพคเกจระบบเริ่มต้นหรือไม่

เพื่อชี้แจงสิ่งที่ฉันต้องการทำคือเรียกใช้คำสั่งที่กำหนดและใน Debian หรืออนุพันธ์ใด ๆ ของมันมันจะส่งคืนบางสิ่งเช่น "apt" ใน openSUSE มันจะส่งคืน "zypp" บน Fedora et al มันจะกลับมา "yum" บน Arch Linux มันจะคืนค่า "pacman" เป็นต้น

ฉันรู้ว่าฉันสามารถทำสิ่งนี้กับสิ่งต่อไปนี้ฉันแค่สงสัยว่ามีวิธีที่แข็งแกร่งกว่านี้ซึ่งจะไม่พังทันทีที่มีการปฏิบัติการที่มีชื่อเดียวกัน

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

คำตอบ:


9

เริ่มต้นด้วยคำตอบที่ยอมรับสำหรับคำถามนี้: ฉันจะรับชื่อการแจกจ่ายและหมายเลขรุ่นในเชลล์สคริปต์แบบง่ายได้อย่างไร . จากนั้นตัดสินใจว่าคุณต้องการใช้ตัวจัดการแพคเกจใดตามการกระจายที่ตรวจพบ


มีรายการตัวจัดการแพคเกจที่พร้อมใช้งานสำหรับการแจกแจงที่แตกต่างกันหรือไม่? มีเดเบียนโคลนจำนวนมากโดยเฉพาะ
DrAl

ไม่แน่ใจเกี่ยวกับรายการที่พร้อมใช้งาน แต่ทั้งหมดโคลน Debian apt-getจะใช้
จิมปารีส

ใช่ฉันรู้แล้ว ปัญหาของฉันไม่ได้ระบุการกระจายมาก (แม้ว่าลิงก์ของคุณจะทำให้ง่ายขึ้นอย่างแน่นอน) แต่การหาวิธีเชื่อมโยงชื่อการแจกจ่ายเช่น (เลือกแบบสุ่ม) "SolusOS" โดยไม่ต้องมีรายการการแจกจ่ายทุกรายการ ที่มีอยู่
DrAl

ใช้วิธี autotools: ตรวจสอบว่าใช้งานได้หรือไม่ BTW ที่การกระจายใช้ apt หมายความว่ามันเป็นญาติ Debian (และพวกมันค่อนข้างกะทัดรัด) การหา yum ไม่ได้หมายความว่าอนุสัญญาบรรจุภัณฑ์ (แบ่งเป็นห้องสมุด / การพัฒนาอิฐก้อนใหญ่หนึ่งของ Perl หรือแพ็คเกจแยก CPAN, ... ) เหมือนกัน อย่าแม้แต่พยายามติดตั้งแพ็คเกจ Fedora บน CentOS (มีอย่างน้อย 3 หรือ 4 ปีในรุ่นที่เอียงเพียงไม่ทำงาน)
vonbrand

การตรวจจับ distro จะใช้งานได้กับอุปกรณ์ยอดนิยมเท่านั้น บัญชีขาวไม่สามารถอัปเดตสำหรับการแจกแจงที่น้อยกว่าทั้งหมด การทดสอบการมีอยู่ของเครื่องมือโดยตรงเป็นวิธีเดียวที่จะทำให้เครื่องมือทำงานได้ ถ้ามันดูเหมือนเป็ดแหวกว่ายเหมือนเป็ดและหว่องเหมือนเป็ดก็อาจเป็นเป็ดก็ได้
ปลดเปลื้อง

8

แทนที่จะระบุโปรแกรมไบนารีคุณควรเริ่มต้นจากการระบุการแจกแจง

เพียงแค่ให้คุณสองสามบรรทัดที่ทำงานในการทุบตีสคริปต์:

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

การผ่านส่วนต่าง ๆ เหล่านี้ไม่สามารถเชื่อถือได้ แต่โดยทั่วไปคนจะไม่ทำเช่นนั้น


2

ฉันเลือกที่จะไปเส้นทางนี้หลังจากตรวจสอบคนอื่น ๆ สิ่งนี้เกิดขึ้นกับฉันเมื่อเรียกใช้คอนเทนเนอร์นักเทียบท่าจำนวนมากและต้องการ curl / jq และไม่สามารถพึ่งพาสิ่งที่มีอยู่ในแต่ละงาน

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.