ฉันจะทราบได้อย่างไรว่ามีการติดตั้งแพคเกจผ่าน yum ใน bash script หรือไม่


75

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

คำตอบ:


76

ผมพบว่าต่อไปนี้บนกึ่งที่เกี่ยวข้องกับคำถาม StackOverflow ; คำตอบที่ฉันต้องการไม่ได้ตอบคำถามที่นั่น (และไม่ได้รับเลือกให้เป็นคำตอบที่ถูกต้อง) ดังนั้นฉันจึงคิดว่าฉันโพสต์ไว้ที่นี่เพื่อให้ผู้อื่นหาง่ายขึ้น

yum list installed PACKAGE_NAME

คำสั่งนี้ส่งคืนเอาต์พุตที่มนุษย์อ่านได้บางส่วน แต่ที่สำคัญกว่าจะส่งคืนรหัสสถานะการออก 0 แสดงแพคเกจมีการติดตั้ง 1 บ่งชี้แพคเกจจะไม่ได้ติดตั้ง (ไม่ได้ตรวจสอบว่าแพคเกจที่ถูกต้องเพื่อyum list installed herpderp-beepbopboopจะกลับมาเป็น "1" เช่นเดียวกับyum list installed tracerouteน้ำพระทัยถ้าคุณไม่ได้ติดตั้ง traceroute) คุณสามารถตรวจสอบ "$?" ในภายหลัง สำหรับรหัสออกนี้

เนื่องจากเอาต์พุตค่อนข้างตอบโต้ฉันจึงใช้ @Chris Downs '"ย่อ" รุ่นด้านล่างในฟังก์ชันตัวตัดคำเพื่อให้เอาต์พุตมีความ "ตรรกะ" มากขึ้น (เช่น 1 = ติดตั้ง 0 = ไม่ได้ติดตั้ง):

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}

การใช้งานจะเป็น

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

แก้ไข:

แทนที่returnงบที่มีการโทรไปtrueและfalseที่ช่วยทำให้ฟังก์ชั่นอ่านได้มากขึ้น / ใช้งานง่ายขณะกลับค่าทุบตีคาด (เช่น 0 จริง 1 สำหรับเท็จ)

หากคุณเพิ่งตรวจสอบหนึ่งแพคเกจในสคริปต์ของคุณคุณอาจจะดีกว่าการทดสอบyum list installedโดยตรง แต่ (IMHO) ฟังก์ชั่นช่วยให้เข้าใจได้ง่ายขึ้นว่าเกิดอะไรขึ้นและไวยากรณ์ของมันจำง่ายกว่าyumการเปลี่ยนเส้นทางทั้งหมด เพื่อลดการแสดงผล


2
คุณไม่จำเป็นต้องตรวจสอบค่าของตนเอง$?เพียงห่อคำสั่งในเงื่อนไข:if yum list installed "$package" >/dev/null 2>&1; then [...]
คริสลง

1
ฉันคิดว่างบ echo ของคุณกลับรายการใช่ไหม isInstalledส่งคืน 1 หากติดตั้งแพ็กเกจ แต่ 1 ถูกประเมินเป็น false ใน bash ดังนั้นจึงไม่ได้สะท้อน "ไม่ได้ติดตั้ง"
FGreg

@FGreg การโทรที่ดี ... ฉันได้แทนที่returnข้อความสั่งด้วยการเรียกไปยังtrueและfalseดังนั้นฟังก์ชั่นนี้จึงสามารถอ่านได้อย่างง่ายดาย
Doktor J

5
OMG คือศตวรรษที่ 21 พวกเขาไม่มีตัวเลือกที่เหมาะสมที่จะบอกว่ามีการติดตั้งแพคเกจหรือไม่ดังนั้นฉันจึงไม่มีฟังก์ชั่นการเขียนหรือ liners หนึ่งอัน!
Sunil D.

21

ไม่ตอบสนองความต้องการเบื้องต้นของคำถาม "ผ่าน yum" แต่เร็วกว่า "yum -q list" คือ:

rpm -q <package_name>

ซึ่งส่งคืนชื่อที่แน่นอนของเวอร์ชันที่ติดตั้งที่อาจเป็นไปได้รวมถึงรหัสข้อผิดพลาด "0" หากติดตั้งและ "1" หากไม่ได้ติดตั้งไว้


+1 เพราะสิ่งนี้เร็วกว่า
Freddie Fabregas

เร็วกว่าแน่นอนเนื่องจากrpmเป็นผู้จัดการแพกเกจท้องถิ่น yumใช้สำหรับจัดการกับแพ็คเกจในที่เก็บระยะไกล
Sergiy Kolodyazhnyy


0

สคริปต์ที่มีประโยชน์สำหรับ yum:

#!/bin/sh pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME) yum update -y for i in ${pckarr[*]} do isinstalled=$(rpm -q $i) if [ ! "$isinstalled" == "package $i is not installed" ]; then echo Package $i already installed else echo $i is not INSTALLED!!!! yum install $i -y fi done updatedb

ในอาร์เรย์ pckarr ให้แสดงรายการแพ็กเกจที่คุณต้องการติดตั้งหรือตรวจสอบว่ามีการติดตั้งหรือไม่


0

คุณยังสามารถอ่านค่าส่งคืน$?จาก yum ควรเป็น 0 ถ้าทุกอย่างทำงานได้ดีหรือเป็นบวกขึ้นอยู่กับปัญหาที่ยัมวิ่งเข้ามา นี่เป็นวิธีที่ดีถ้าคุณต้องการดำเนินการต่าง ๆ หากมีบางอย่างล้มเหลว

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