การเขียนสคริปต์แบบพกพามีความสำคัญเมื่อใด


18

รหัสส่วนใหญ่ฉันเขียนอยู่ใน PHP ฉันเพิ่งเริ่มเรียนรู้การเขียนสคริปต์เชลล์ ทรัพยากรและแบบฝึกหัดส่วนใหญ่ที่ฉันเจอนั้นเฉพาะเจาะจงกับ Bash บางคนเตือนเกี่ยวกับ bashisms และบางคนไม่ทำ ฉันอ่านมากที่นี่และ Stack Overflow

เมื่อใดก็ตามที่คำตอบใช้bashismsบางคนย่อมแสดงความคิดเห็นว่า:

คุณไม่ควรใช้ <insert bashism ที่นี่> มันไม่ได้พกพา

bashนี้เกิดขึ้นแม้ในขณะที่คำถามที่ได้รับการติดแท็กด้วย สำหรับฉันแล้วมันเหมือนกับบอกโปรแกรมเมอร์ PHP ว่าพวกเขาไม่ควรใช้รหัสที่ใหม่ใน PHP 5 เพราะมันไม่สามารถใช้กับ PHP 4 หรือบอกคนที่พวกเขาไม่ควรเขียนอะไรบางอย่างสำหรับ Mac เพราะมันไม่สามารถใช้ บน Windows

เมื่อผมเขียนใน PHP, ฉันได้รับความต้องการขั้นต่ำและที่ผมเขียนไปข้างหน้ารหัสใช้ได้กับระบบปฏิบัติการ ฉันไม่ต้องกังวลกับการทำให้ย้อนกลับ -เข้ากันได้

ถ้าฉันใช้#!/bin/bashเป็นสาวเธอทำไมฉันไม่ควรใช้วิธีการทุบตี? ฉันเริ่มที่จะได้รับความประทับใจที่บางคนชอบทุบตี bashisms (ปุนตั้งใจ) เพียงเพื่อประโยชน์ของมัน

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

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

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

ดังนั้นเมื่อใดจึงสำคัญที่ต้องเขียนสคริปต์แบบพกพา

ตัวอย่างเช่น,

  • สคริปต์ประเภทใดควรพกพาได้มากที่สุด
  • ระบบที่ไม่ได้ติดตั้ง Bash นั้นพบได้บ่อยแค่ไหน?
  • ถ้าระบบติดตั้ง Bash แล้วจะมีรุ่นค้นหา GNU และโปรแกรมอรรถประโยชน์อื่น ๆ ด้วยหรือไม่

4
ฉันตอบคำถามนี้และตอบคำถามนี้ แต่ยิ่งฉันคิดเพียงคำถาม 2 ข้อสุดท้ายที่เข้ากับเว็บไซต์ คนอื่น ๆ เป็น "พื้นฐานความคิดเห็นเป็นหลัก"
จอร์แดน

1
นอกจากนี้ยังมีแง่มุมเมตาในคำถามนี้: แม้ว่ามันอาจจะไม่ได้ช่วยตอบคำถามเบื้องต้น แต่ความคิดเห็นเช่น "นี่ไม่ใช่แบบพกพา" จะมีประโยชน์มากสำหรับผู้อ่านคนอื่น ๆ ที่สะดุดกับคำถาม / คำตอบเดือนหรือปีต่อมา
Bananguin

2
@Bananguin ความคิดเห็นที่พูดว่า "นี่ไม่ใช่พกพา" ไม่รบกวนฉัน นั่นเป็นเพียงแค่ FYI ฉันแสดงความคิดเห็นเหล่านั้นด้วยตัวเอง มันคือ "คุณไม่ควรใช้ ... " ที่รบกวนจิตใจฉัน แสดงว่ามีบางอย่างผิดปกติกับคำตอบ นั่นจะใช้ได้ถ้าคำตอบคือการแนะนำรหัสที่เลิกใช้แล้ว ดังนั้นฉันจึงสงสัยว่า Bash ผิดปกติอะไร
toxalot

2
+1 โดยเฉพาะอย่างยิ่งเมื่อคำถามมีbashแท็กเพียงอย่างเดียวมีคนแสดงความคิดเห็นว่า "มันน่าเบื่อและไม่ใช่พกพา" เมื่อฉันตอบคำถามที่ติดแท็กCฉันไม่สนใจว่าจะพกพาไปJavaได้หรือไม่
PP

4
ฉันรู้สึกดีเสมอที่จะชี้ให้เห็นว่ามันเป็นbashคุณสมบัติเฉพาะและไม่ใช่แบบพกพาเหมือนกับที่ฉันจะชี้ให้เห็นว่ามีการใช้ส่วนขยายเฉพาะของ GNU สำหรับยูทิลิตี้บางอย่าง (แม้ว่าคำถามจะถูกแท็กเป็น Linux) ฉันไม่เคยเห็นใครพูดว่า "นี่เป็นความนิยมและคุณไม่ควรใช้"
Martin Tournoij

คำตอบ:


15

ในฐานะสมาชิกของชุมชนนี้ฉันมักจะไม่เห็นคนที่ไม่สนใจความผิดพลาดในสิ่งที่กำหนดเป้าหมายการทุบตี เมื่อพูดถึงการพกพา GNUisms นั้นแย่กว่า bashisms มาก ตราบใดที่คุณใช้bashสำหรับ shebang ของคุณคุณสามารถคาดหวังให้สคริปต์ทำงานbashได้ อย่างไรก็ตามคุณไม่สามารถรับประกันรุ่นได้จนกว่าคุณจะตรวจสอบอย่างชัดเจน Bash เวอร์ชัน 4 นำคุณสมบัติที่มีประโยชน์บางอย่างเช่นอาเรย์แบบเชื่อมโยง แต่ Bash v3 ยังคงใช้กันอย่างแพร่หลายใน OS X และ RHEL 5

สคริปต์ประเภทใดควรพกพาได้มากที่สุด

นี่คือเพิ่มเติมเกี่ยวกับความต้องการของคุณและสิ่งที่คุณเลือกที่จะสนับสนุนในฐานะนักพัฒนา หากคุณกำลังเขียนสคริปต์การติดตั้งสำหรับแอปพลิเคชันที่รองรับ * NIX ทุกประเภทความสามารถในการพกพาจะมีความสำคัญมาก

ระบบที่ไม่ได้ติดตั้ง Bash นั้นพบได้บ่อยแค่ไหน?

FreeBSD และ Solaris 10 เป็นตัวอย่างของระบบที่ไม่ได้ติดตั้ง bash เป็นค่าเริ่มต้น ระบบลีนุกซ์ส่วนใหญ่จะมียกเว้นระบบฝังตัว

ถ้าระบบติดตั้ง Bash แล้วจะมีรุ่นค้นหาของ GNU และโปรแกรมอรรถประโยชน์อื่น ๆ ด้วยหรือไม่

ไม่และนี่คือปัญหาจริงที่มีการพกพา หากการพกพามีความสำคัญคุณควรใช้คุณสมบัติคำสั่งเชลล์ที่กำหนดโดยมาตรฐาน POSIX เท่านั้น สามารถติดตั้งยูทิลิตี้ GNU ในระบบที่ไม่ใช่ GNU เช่น FreeBSD ได้ แต่ไม่น่าจะเป็นอันดับแรกใน PATH และคุณไม่สามารถพึ่งพาเครื่องมือเหล่านั้นเพื่อติดตั้งได้


1
ฉันคิดว่ามันมากขึ้นในดังนั้นกว่าที่นี่ที่ผมมักจะเห็นคนที่ไม่คำนึงถึง bashisms ฉันเพิ่งรู้ว่าฉันสังเกตเห็นบ่อยครั้งพอที่จะทำให้หงุดหงิดและแจ้งให้ฉันถามคำถามนี้
toxalot

1
ดังนั้นถ้ามีการติดตั้งยูทิลิตี้ GNU แต่ไม่ใช่อันดับแรกใน PATH จะมีวิธีเรียกพวกมันเป็นพิเศษไหม? มิฉะนั้นทำไมจึงติดตั้งเลย
toxalot

@toxalot: ไบนารีและสคริปต์ถูกเรียกอย่างชัดเจนโดยใช้เส้นทางที่แน่นอน
Bananguin

1
@Bananguin ดังนั้นถ้ามีใครติดตั้งยูทิลิตี Bash และ GNU (แต่ไม่ใช่ใน PATH) พวกเขาสามารถใช้สคริปต์ได้หากพวกมันแก้ไขเพื่อใช้เส้นทางที่แน่นอนfindและยูทิลิตี้เฉพาะ GNU อื่น ๆ ที่ฉันเคยใช้? เห็นได้ชัดว่าจะไม่เป็นมิตรกับผู้ใช้สำหรับสคริปต์ตัวติดตั้ง แต่ฉันกำลังคิดว่าจะเอาอะไรใส่ GitHub เพื่อให้คนอื่นคว้าถ้าพวกเขาต้องการ ฉันไม่สนใจว่ามันไม่สามารถพกพาได้ในทุกระบบ ฉันไม่ต้องการให้มันไร้ประโยชน์ในหลาย ๆ ระบบ
toxalot

1
@toxalot: ใช่ที่สามารถทำงานได้ หากคุณใส่สิ่งที่ชอบFIND=/opt/gnu/dispicable/bin/findไว้ที่จุดเริ่มต้นของสคริปต์ของคุณแล้วใช้${FIND}แทนfindสคริปต์ของคุณคุณให้ตำแหน่ง (!) แก่ผู้อื่นเพื่อวางเส้นทางการติดตั้งและทำให้สคริปต์ของคุณใช้เครื่องมือที่ถูกต้อง
Bananguin

5

ดังนั้นเมื่อใดจึงสำคัญที่ต้องเขียนสคริปต์แบบพกพา

สคริปต์ประเภทใดควรพกพาได้มากที่สุด

เมื่อคุณใช้พวกเขาสำหรับสภาพแวดล้อมการทำงานของคุณและคุณทำงาน (หรืออาจเป็นในอนาคต) บนเครื่องที่แตกต่างกัน - และคุณไม่จำเป็นต้องเขียนเครื่องมือของคุณอีกครั้งก่อนลงมือทำงาน

เช่น: สคริปต์ถังขยะ / การrmแทนที่


มาร์คสจ๊วต:

... สำหรับชุดเครื่องมือแก้ไขปัญหาของฉันฉันคิดว่าฉันจะมี vi และ Korn shell เท่านั้น และฉันพยายามใช้คำสั่งที่ใช้งานได้กับ Unix รสชาติส่วนใหญ่


3
ฉันชอบ "Bash-isms" ที่ลื่นไหล แต่สำหรับชุดเครื่องมือแก้ไขปัญหาของฉันฉันคิดว่าฉันจะมี vi และ Korn เชลล์เท่านั้น และฉันพยายามใช้คำสั่งที่ใช้งานได้กับ Unix รสชาติมากที่สุด ด้วยวิธีนี้ฉันพร้อมที่จะทำการทดลองบนระบบที่ป่วยโดยไม่ต้องกังวลว่าคำสั่ง ps จะทำงานอย่างไรไม่ว่าจะมี Bash หรือ Perl หรือ PHP หรือที่ใดก็ตาม
Mark Stewart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.