เชลล์ไม่เฉพาะเจาะจงอะไร


9

ภายใต้คำตอบบางอย่างฉันเห็นความคิดเห็นที่แนะนำให้หลีกเลี่ยงคำสั่งเฉพาะของเชลล์ในคำตอบ

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

  • man builtinsให้รายการคำสั่ง คำสั่งเหล่านั้นเป็นคำสั่งเดียวที่ฉันสามารถใช้ในเชลล์สคริปต์แบบพกพาที่ใช้ได้กับเชลล์ทั้งหมดหรือไม่?
  • ในตัวสามารถเป็นเปลือกเฉพาะ?
  • มาตรฐานสำหรับ Linux แตกต่างจาก Unixes อื่น ๆ หรือไม่?
  • แล้วไวยากรณ์ล่ะ เครื่องหมายวรรคตอนโอเปอเรเตอร์และอื่น ๆ อาจแตกต่างกันในหอยบางตัวหรือไม่?

คำตอบ:


12

Greg's Wikiมีโพสต์เกี่ยวกับการปรับ bash script สำหรับ Dashที่ชี้ให้เห็น 'bashisms' มากมาย - คุณสมบัติพิเศษที่ไม่ได้มาตรฐาน แต่เป็นส่วนหนึ่งของ bash การหลีกเลี่ยงการ bashisms เหล่านั้นสามารถช่วยทำให้สคริปต์ของคุณเป็นมิตรกับสภาพแวดล้อมที่แตกต่างกัน นี่เป็นการตอบคำถามของคุณโดยเฉพาะ ตัวอย่างเช่นใช่มีตัวดำเนินการที่แตกต่างกัน (เช่น==) แต่มีชุด Posix มาตรฐานที่ควรทำงานในทุกสภาพแวดล้อม

สำหรับการอ่านอย่างละเอียดมากขึ้นคุณสามารถตรวจสอบมาตรฐาน Posixซึ่งกระสุนทั้งหมดควรปฏิบัติตาม โดยเฉพาะปริมาณใน "Shell & Utilities"

สิ่งที่ฉันพบความท้าทายมากกว่าความแตกต่างของเชลล์คือความแตกต่างของคำสั่ง ระบบ Linux หลายระบบมี GNU findแต่ถ้าคุณกำลังเขียนสคริปต์แบบพกพาอย่าพึ่งพาตัวเองman findเพราะมีระบบจำนวนมากที่มี BSD findซึ่งมีชุดคุณสมบัติที่แตกต่างกัน หากคุณกำลังเขียนสคริปต์สำหรับ busybox คุณจะพบว่ามีเวอร์ชันที่แตกต่างกับncs ที่แตกต่างกันโดยสิ้นเชิง สิ่งเหล่านี้คือสิ่งต่าง ๆ ที่ทำให้ฉันมักจะใช้เมื่อฉันปรับใช้สคริปต์กับสภาพแวดล้อมที่แตกต่างกัน

สำหรับการอ่านเพิ่มเติมเกี่ยวกับวิธีปฏิบัติในการเขียนสคริปต์เชลล์ที่ดีนอกจากนี้ยังมีแหล่งข้อมูลที่ดีในบล็อกของ David Pashley: การเขียนสคริปต์เชลล์เชลล์ที่แข็งแกร่ง

ตรวจสอบให้แน่ใจว่าคุณอ่านคำตอบและความคิดเห็นของGillesในเว็บไซต์นี้ เขามีเคล็ดลับมากมายเกี่ยวกับการทำให้แน่ใจว่าคุณใช้รหัสพกพา


5

การเขียนเชลล์สคริปต์ในเชลล์เฉพาะหมายถึงการติดตั้งเชลล์นั้น มาตรฐานเดียวเท่านั้นที่จะมีcshและshติดตั้งผ่านตัวแปร Unix ทั้งหมด ดังนั้นถ้าคุณต้องการให้สคริปต์ของคุณทำงานบน Solaris, * BSD และ GNU คุณต้องเขียนมันลงไปเช่น Bourne shell

อย่างไรก็ตามคำสั่ง Unix ส่วนใหญ่มีไวยากรณ์ที่แตกต่างกันภายใต้การใช้งานที่แตกต่างกัน - ดูที่psSolaris, FreeBSD และ GNU - ดังนั้นขึ้นอยู่กับเครื่องมือที่คุณใช้สคริปต์ของคุณอาจไม่สามารถพกพาได้ ตำแหน่งที่ติดตั้งเชลล์จะมีความสำคัญเช่นกัน มันเป็น/bin/bash /usr/bin/bash, /usr/local/bin/bashหรือที่อื่น?

ฉันไม่ทราบมาตรฐานใด ๆ ที่กำหนดเชลล์ ดูที่rcหรือ http://192.220.96.201/es/es-usenix-winter93.html`"> สำหรับกระสุนแปลก ๆ ที่ไม่ได้มาตรฐานอย่างไรก็ตามเหล่านั้นดูเหมือนจะยังคงสอดคล้องกับแนวคิดทั่วไปบางอย่าง


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