ตรวจสอบการอ้างอิงสคริปต์ bash / shell


13

มีวิธี / คำสั่งเพื่อตรวจสอบการพึ่งพาของ bash script หรือไม่ กล่าวอีกนัยหนึ่งการตอบคำถามนี้: ผู้ใช้ควรติดตั้งไลบรารีใดเพื่อเรียกใช้สคริปต์

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

คำตอบ:


8

ระบบ autoconf arcane ที่เหลือเชื่อถูกนำมาใช้เพื่อ

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

หากนั่นไม่น่ากลัวพอให้รอจนกว่าคุณจะลองเขียนสคริปต์ autoconf ตัวแรกของคุณ ผู้เขียน autoconf ไม่อายเกี่ยวกับความยากลำบาก :

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

ในอีกทางหนึ่งคุณจะออกจากกระบวนการที่รู้เพิ่มเติมเกี่ยวกับบิตของระบบต่าง ๆ ที่น่าเบื่อกว่าที่คุณเคยจินตนาการไว้

ทุกวันนี้ส่วนตัวผมจะถือว่าการกระจาย Debian-ish มาตรฐานมากขึ้นคือเป้าหมายของฉันและไม่ทำให้ตัวเองเขียนสคริปต์ autoconf อีกตัว ฉันโชคดีที่มีความหรูหราให้เลือก; คุณอาจไม่มีละติจูดดังกล่าว


3

นี่ไม่ใช่งานง่ายที่จะทำให้เป็นอัตโนมัติเพราะสคริปต์อาจใช้โครงสร้างที่เอาชนะการวิเคราะห์แบบคงที่ ถ้ามันไม่เคยใช้evalหรือคำนำหน้าใด ๆ เช่นtimeหรือniceมันจะไม่เป็นง่ายๆเป็นสิ่งที่ต้องการทำงานegrep -o '^[^ ]+ ? 'เพื่อให้ได้คำสั่งและทำงานให้พวกเขาผ่านหรือwhichtype

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

ต้องบอกว่าบางสิ่งเช่นนี้จะช่วยได้:

#!/bin/bash
egrep -o -e '^[^ ]+ ? ' -e '[a-zA-Z0-9]+' "$1" | sort -u | {
    while read line
    do
        if type $line &>/dev/null
        then
            echo "$line found"
        else
            echo "Error: $line not found"
        fi
    done
} | sort

ผลลัพธ์จะมีลักษณะดังนี้:

$ ./check i_wonder.sh
cd found
echo found
elif found
else found
Error: abort not found
Error: checkurl not found
Error: cleanup not found
Error: count not found
Error: debug not found
Error: deleteFile not found
Error: die not found
find found
for found
grep found
if found
mv found
readarray found
rm found
shopt found
size found
sleep found
stat found
trap found
unset found
while found
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.