วิธีที่ดีที่สุดในการตรวจจับ (จากสคริปต์) ว่าติดตั้งซอฟต์แวร์คืออะไร?


9

ฉันเคยผิดหวังมาก่อนด้วยความแตกต่างของเอาต์พุตจากwhichคำสั่งข้ามแพลตฟอร์มที่แตกต่างกัน (Linux กับ Solaris vx. OS X) ด้วยกระสุนที่แตกต่างกันอาจจะเล่นในเรื่องนี้เช่นกัน typeได้รับการแนะนำว่าเป็นทางเลือกที่ดีกว่า แต่มันจะเป็นแบบพกพาได้อย่างไร

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

ในการใช้ตัวอย่างที่เป็นไปได้เพียงอย่างเดียวสมมติว่าฉันต้องตรวจจับจากสคริปต์ว่า bash และ zsh มีอยู่ในเครื่องหรือไม่จากนั้นเรียกใช้คำสั่งด้วย zsh หากมีอยู่และทุบตีถ้า zsh ไม่ได้และ bash นั้นเพียงพอ เวอร์ชันที่ไม่มีข้อผิดพลาดเฉพาะ ส่วนที่เหลือของสคริปต์อาจเป็น Bourne shell หรือ Ruby หรืออย่างอื่น แต่สิ่งนี้สิ่งหนึ่งที่ต้องทำ (AFAIK) ด้วย zsh หรือ bash เวอร์ชันล่าสุด

ฉันสามารถนับtypeได้ว่ามีอยู่ในแพลตฟอร์มหรือไม่ มีทางเลือกอื่นwhichที่สามารถตอบคำถามได้อย่างง่ายดายและต่อเนื่องว่ามีการติดตั้งซอฟต์แวร์บางส่วนหรือไม่?

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

คำตอบ:


10

ในศตวรรษที่ 21 โดยเฉพาะหากคุณกำหนดเป้าหมายเครื่องที่มีแนวโน้มว่าจะทุบตีหรือ zsh คุณสามารถวางใจได้ว่าจะสามารถtypeใช้งานได้ (มันไม่ได้มีอยู่ใน unices เก่ามากเช่นในจากปี 1970 หรือต้นปี 1980) คุณไม่สามารถนับออกมันหมายถึงอะไร แต่คุณสามารถนับ 0 กลับถ้ามีคำสั่งโดยชื่อและ ไม่ใช่ศูนย์มิฉะนั้น

whichไม่ได้มาตรฐานและไม่น่าเชื่อถือในการปฏิบัติ typeเป็นทางเลือกที่แนะนำ whereisทนทุกข์ทรมานจากปัญหาเดียวกันกับwhichและเป็นเรื่องธรรมดาน้อย whenceเฉพาะกับ ksh และ zsh

เมื่อเป็นไปได้มันจะมีความน่าเชื่อถือมากกว่าในการทดสอบการมีอยู่ของคำสั่งและทดสอบว่าพฤติกรรมของมันดูสมเหตุสมผลหรือไม่ ตัวอย่างเช่นทดสอบการมีอยู่ของรุ่นทุบตีที่เหมาะสมด้วยการวิ่งbash -c 'somecommand'เช่น

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

วันนี้คุณสามารถไว้วางใจได้เกือบทุกอย่างในสเปคSinge UNIX เวอร์ชั่น 2 (ยกเว้นสิ่งแปลกใหม่เช่น Fortran และ SCCS ซึ่งเป็นทางเลือก) คุณสามารถวางใจได้กับเวอร์ชัน 3ส่วนใหญ่แต่ก็ยังไม่ได้นำไปใช้อย่างสมบูรณ์ในทุกที่ การสนับสนุนเวอร์ชัน 4คือ sketchier หากคุณกำลังจะอ่านข้อกำหนดเหล่านี้ฉันขอแนะนำให้อ่านเวอร์ชัน 3 ซึ่งอ่านได้ง่ายกว่าและคลุมเครือน้อยกว่ารุ่น 2 มาก

ตัวอย่างเช่นวิธีการตรวจสอบความเฉพาะเจาะจงของระบบให้ดูที่autoconfและconfigureสคริปต์ของซอฟต์แวร์ต่างๆ

ดูแหล่งข้อมูลสำหรับการเขียนโปรแกรมเชลล์แบบพกพาสำหรับเคล็ดลับเพิ่มเติม


ซึ่งอาจได้รับประโยชน์จากการขยายตัวในการแสดงความคิดเห็นในเทคนิคที่แนะนำโดยทั่วไปใช้และhash command -v
คาเลบ

@Caleb สำหรับจุดประสงค์ของคำถามนี้ฉันไม่เห็นประโยชน์command -vมากกว่าtypeทุกสิ่งที่เราต้องการคือผลลัพธ์แบบบูล hashคุณหมายถึง“ เทคนิคที่แนะนำโดยทั่วไปที่ใช้” อะไร?
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.