วิธีตรวจสอบจาก bash ว่ามีแพ็คเกจอยู่ใน Debian หรือไม่


12

ฉันต้องการเขียนสคริปต์ทุบตีการติดตั้งที่ฉันต้องการติดตั้งเซิร์ฟเวอร์ MySQL

บน Linux Mint ฉันได้ติดตามโค้ด:

apt-get -y --force-yes install mysql-server-5.6

แต่ผมติดตั้งใหม่ Debian 8 และไม่มีmysql-server- mariadbแทนมี

ฉันจะทราบได้อย่างไรว่ามีแพ็คเกจอยู่หรือไม่

ฉันเพิ่งรู้ว่ามีสิ่งdpkg -sที่ควรบอกว่ามีการติดตั้งแพคเกจ


3
--force-yesปิดใช้งานความปลอดภัยทั้งหมดเพื่อให้คุณสามารถทำลายระบบของคุณจนไม่มีการซ่อมแซม นอกจากนี้: --force-yesการแทนที่ -y(ยกเลิกการใช้งาน) ที่หลังอาจจะเป็นตัวเลือกของทางเลือก: รูปแบบยาวของการ-yเป็น--assume-yesและนั่นคือสิ่งที่มันไม่; การบอกว่าใช่จนกว่ามันจะน่าเกลียดจริง ๆ โดยมีความเสี่ยงต่อความเสียหายในองค์ประกอบหลักปัจจัยพื้นฐานและอื่น ๆ การ--forceแทนที่การรักษาความปลอดภัย (เรียนรู้อย่างหนัก)
erch

ภาคผนวก: คุณอาจสนใจใน--simulateตัวเลือกสำหรับapt-get, เพื่อทำ--dry-run, ในกรณี
erch

1
เพื่อชี้แจง: คุณต้องการค้นหาว่าแพ็คเกจอยู่ในที่เก็บใด ๆ ที่กำหนดไว้/etc/apt/sources.listใช่ไหม?
wullxz

โปรดทราบว่าจริงๆแล้วมีแพ็คเกจ mysql-server ใน Debian 8 ข้างๆ mariadb: packages.debian.org/jessie/mysql-server
Dan Getz

คำตอบ:


13

(ด้านล่างมาจาก Ubuntu แต่เทคนิคเดียวกันนี้ใช้ได้กับ Debian อย่างเห็นได้ชัด)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...

หากมีแพ็คเกจอยู่ข้อมูลจะปรากฏขึ้น ถ้าไม่คุณจะเห็นสิ่งที่ชอบ:

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

นอกจากนี้รหัสทางออกของapt-cacheจะไม่ใช่ศูนย์หากไม่พบแพ็คเกจที่ตรงกัน

หมายเหตุเพิ่มเติม:หากคุณกำลังใช้apt-cache show packageที่แพคเกจเป็นหนึ่งเสมือน (หนึ่งที่ไม่มีอยู่ แต่เป็นตัวอย่างเช่นอ้างอิงโดยแพคเกจอื่น ๆ ) คุณจะได้รับ:

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

สิ่งexit codeนี้เป็นศูนย์ (ซึ่งค่อนข้างทำให้เข้าใจผิดในความคิดของฉัน)


3
เพียงเพื่อให้เสร็จสมบูรณ์คำตอบนี้: คุณยังสามารถค้นหาที่เก็บที่กำหนดไว้จากด้วยคำสั่งนี้sources.list apt-cache search *searchstring*คำสั่งนั้นจะค้นหาคำอธิบายของแพ็คเกจและสามารถช่วยคุณค้นหาแพ็คเกจที่คุณไม่ทราบชื่อแพคเกจที่แน่นอน
wullxz

1
@wullxz เฉพาะการapt-cache search ...แข่งขันประเภทใดก็ได้และแอป ส่งคืน 0 แม้ว่าจะไม่พบสิ่งใดซึ่งไม่สามารถใช้งานได้จริงในสคริปต์ทุบตี
Alexis Wilke

4

dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed"ผมจะใช้

มันจะตรวจสอบว่าmysql-serverมีการติดตั้งแพคเกจหรือไม่และถ้าเป็นเช่นนั้นมันจะพิมพ์ความจริงนี้ไปที่หน้าจอ โซลูชั่นที่ซับซ้อนมากขึ้นจะเป็นในทุบตี (ยังไม่ทดลอง):

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

ดังนั้นหนึ่งสามารถทำได้ในสคริปต์:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi

5
ผมคิดว่าเขาต้องการที่จะทราบว่าแพคเกจที่มีอยู่ที่ทุกคนและไม่ได้หากมีการติดตั้งอยู่บนเครื่องท้องถิ่น ...
wullxz

0

ในหนึ่งซับ:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

ออกด้วย 0 หากมีอยู่ 1 ถ้าไม่ออก

โบนัส:ตรวจสอบแพคเกจที่มีประสิทธิภาพหลายรายการในไฟล์ "packages_we_want" หนึ่งรายการต่อบรรทัดเรียงลำดับด้วยsort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantแสดงรายการแพ็กเกจทั้งหมดที่คุณต้องการ แต่ไม่มีอยู่ในที่เก็บ

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want แสดงรายการแพ็กเกจทั้งหมดที่คุณต้องการและมีอยู่ในที่เก็บ

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