ควรใช้ Bash เมื่อใดและเมื่อใดควรใช้ Perl / Python / Ruby [ปิด]


78

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

คุณตัดสินใจอย่างไรเมื่อใช้ Perl / Python / Ruby ผ่าน Bash สำหรับสคริปต์ ฉันไม่คิดว่าสคริปต์เริ่มต้นที่ใช้ Ruby มีเหตุผล แต่ใช้เวลานานกว่าสคริปต์เล็กน้อยที่เพิ่มบัญชีอีเมล


1
หากคุณสามารถทำได้โดยใช้มันเป็นสิ่งสำคัญจริงๆ? ตัวเลือกนั้นน่าสนใจก็ต่อเมื่อสคริปต์ที่ได้นั้นมีความแตกต่าง ตัวอย่างเช่นเวลาดำเนินการอาจแตกต่างกันอย่างมาก (ไม่ใช่ปัญหาที่เกิดขึ้นเมื่อบัญชีอีเมล)
เดนนิส

คำตอบ:


44

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

Bash เป็นภาษาสคริปต์วัตถุประสงค์ทั่วไปเช่น Python, Ruby, Perl แต่แต่ละภาษาก็มีจุดแข็งที่แตกต่างกันไป Perl เก่งในการวิเคราะห์ข้อความ Python อ้างว่าเป็นกลุ่มที่สง่างามที่สุดสคริปต์ Bash นั้นยอดเยี่ยมที่ "piping stuff around" ถ้าคุณรู้ว่าฉันหมายถึงอะไรและ Ruby ... ดีทับทิมเป็นพิเศษเล็กน้อยในหลาย ๆ ของวิธี

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

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

นอกจากนี้โปรดจำไว้ว่าการเรียนรู้การเขียนสคริปต์เชลล์นั้นง่ายมาก พลังที่แท้จริงของมันอยู่ในโปรแกรมอื่น ๆ เช่น awk, sed, tr, et al


ฉันมีประสบการณ์ค่อนข้างมากเกี่ยวกับ bash scripting เช่นเดียวกับ Ruby แต่บางครั้งฉันก็ยังไม่รู้ว่าจะใช้อะไร การเลือกตามความชอบส่วนตัวในขณะนั้นดูเหมือนว่าโง่ แต่คุณพูดถูกฉันจะถามตัวเองว่าฉันต้องการทำอะไรและเลือกเครื่องมือที่ดีที่สุดสำหรับงานนี้
futlib

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

แค่อยากจะเพิ่มมันด้วยการใช้โปรแกรมขนาดเล็กในแพ็คเกจ GNU coreutils (เช่น tr, sort, uniq) และทำการ piping มันเป็นไปได้ที่จะทำงานให้สำเร็จลุล่วง
GMaster

58

TL; DR - ใช้ทุบตีเพียงสำหรับการติดตั้งภาษาที่ดีขึ้น (ถ้ามันไม่ได้อยู่แล้ว) มิฉะนั้นคุณจะไม่สามารถกู้คืนการสูญเสียเวลาอันมีค่าของมนุษย์ หากคุณไม่สามารถทำได้บนบรรทัดคำสั่งด้วยมือโดยไม่มีข้อผิดพลาดอย่าใช้สคริปต์ด้วย bash / shell

มันคือปี 2015 ดังนั้นฉันจะพิจารณาสิ่งต่อไปนี้:

  1. หน่วยความจำเหนือศีรษะ

    • โอเวอร์เฮดของหน่วยความจำรันไทม์ Ruby / Python เทียบกับ bash นั้นมีขนาดเล็ก (เนื่องจากมี shared library) ในขณะที่หนึ่งอาจไม่สามารถรักษาสคริปต์ bash ที่ไม่น่ารำคาญได้ (เช่นที่มีมากกว่า> 100 บรรทัด) - ดังนั้นการใช้หน่วยความจำ
  2. เวลาเริ่มต้น

    • การเริ่มต้น Ruby / Python อาจช้าลงเล็กน้อย แต่โอกาสที่คุณจะไม่ได้ใช้กระบวนการ Ruby / Python เต็มจำนวนมากในการวนรอบแน่น 100 ครั้งต่อวินาที (ถ้าคุณมีความต้องการเหล่านั้น bash / shell คือ ยังมีค่าใช้จ่ายมากเกินไปและคุณอาจต้องไปที่ C / C ++)
  3. ประสิทธิภาพ

    • การบีบอัดข้อมูลทั่วไปเกือบทั้งหมดจะเร็วกว่าใน Ruby / Python หรือเทียบเท่าอย่างน้อย (หรือคุณต้องการ C / C ++ / Haskel / OCaml / อะไรก็ตาม)
    • ประสิทธิภาพที่แท้จริง / คอขวดในการดำเนินการ (หรือแม้กระทั่งผลผลิต) แทบจะไม่เคย "ขาดการใช้ bash / shell" (แม้แต่การสลับ Ubuntu สำหรับการเริ่มต้นแสดงว่า bash เป็นปัญหาจริง ๆ หรือไม่และอาจเป็นกรณีใช้งาน busybox เท่านั้น เพราะมีเป็นอะไรมากไปกว่า 'ทุบตี' และ 'vi' การเขียนและเรียกใช้รหัสและมักจะมีวิธีการที่จะเพิ่ม / ดาวน์โหลดหรือเก็บสิ่งอื่น) ไม่มี
    • การใช้กระบวนการอื่น ๆ เพื่อทำงาน (เช่น sed / awk / grep) จริง ๆ แล้วมีขนาดที่ช้ากว่าการเรียกเมธอดบน live object ในหน่วยความจำ
  4. ผลผลิต

    • มันง่ายเกินไปที่จะทำผิดพลาดใน Bash / shell เมื่อเทียบกับการใช้วิธี "real" พารามิเตอร์ตัวแปรและข้อยกเว้นใน Ruby / Python
    • Agile เป็นกระแสหลักในขณะที่ Bash ไม่ได้รับการสนับสนุน (ขาดความสามารถในการทดสอบหน่วย, ไลบรารี, OO, ต้นแบบ, linting, วิปัสสนา, การบันทึก, metaprograming; แทบเป็นไปไม่ได้ที่จะ refactor โดยไม่ทำลายอะไรเลย)
    • วิธีที่เข้ากันไม่ได้มากเกินไปกับเชลล์อื่น ๆ ตัวแปรสภาพแวดล้อมเล็กน้อยสามารถทำลายสคริปต์ได้อย่างสมบูรณ์ (และเครื่องมือ dev-ops ที่สำคัญบางอย่างเช่น Puppet ละเว้นบรรทัด shebang และส่งผ่านหรือเขียนตัวแปรเชลล์สำคัญอีกครั้ง) ในขณะที่ Ruby / Python พา ธ แม้สำหรับการเปลี่ยนแปลงเวอร์ชันหลัก
    • การเรียนรู้ภาษาใหม่ใช้เวลาเพียงเล็กน้อยหรือใช้เวลาในการดีบักเชลล์สคริปต์เนื่องจากปัญหาเฉพาะเชลล์ (โดยเฉพาะ - ชื่อตัวแปรไม่มีบูลีนไม่มีข้อยกเว้น ฯลฯ )
    • แม้แต่สคริปต์เริ่มต้นก็เป็นระเบิด ( โดยเฉพาะอย่างยิ่งเพราะพวกเขาสามารถล้มเหลวในระหว่างการเริ่มต้นระบบ ) และเนื่องจากข้อบกพร่องด้านความปลอดภัยที่ผ่านมากับทุบตีคุณอาจจะดีกว่าด้วยการใช้ C ธรรมดา (กับไลบรารีที่ดี) - ใช่ C ต้องการคอมไพล์ แต่แม้แต่ shell script ธรรมดาอาจต้องการที่เก็บจากนั้นทำการกำหนดเวอร์ชันจากนั้นจึงบรรจุภัณฑ์ต่อไป
    • สิ่งที่สามารถใช้ได้กับ sed / awk / grep นั้นมีอยู่แล้วใน Ruby / Python - โดยไม่ต้องพึ่งพาหรือ "ความแตกต่าง" ระหว่างรุ่นของเครื่องมือเหล่านั้นข้ามแพลตฟอร์ม (ดังนั้นถ้ามันทำงานบนการตั้งค่าของคุณ )
  5. งานรักษาความปลอดภัย
    • จุดประสงค์ของงานที่คุณไม่ชอบคืออะไร (นอกเสียจากคุณชอบที่จะใช้ข้อผิดพลาดที่ยากต่อการดีบัก แต่เป็นข้อบกพร่องของสคริปต์เชลล์)

ฉันพบว่าไม่มีเหตุผลที่จะใช้ Bash / Shell หากคุณติดตั้ง Ruby / Python

และอาจได้รับการติดตั้ง Ruby / Python ไม่จำเป็นต้องใช้สคริปต์ทุบตีในตอนแรก (ยกเว้น busybox เครื่องมือระบบบางอย่างขึ้นอยู่กับ Python / Perl ที่มีอยู่)

และทุกครั้งที่คุณเขียนเชลล์สคริปต์คุณจะ "ฝึกหัด" ทำสิ่งนั้น - แทนที่จะเรียนรู้สิ่งที่ทรงพลัง / มีประสิทธิผลมากขึ้น

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

สรุป: ใช้ bash / shell เฉพาะเมื่อคุณถูกบังคับให้ต้อง (อย่างเช่น~/.bashrcbusybox) เท่านั้นเพราะแทบจะไม่เคยเป็น "เครื่องมือที่เหมาะสมสำหรับงาน" ในปัจจุบัน


28

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

ฉันใช้ Perl และ python เมื่อโฟกัสหลักของฉันคืออ่านข้อมูลจากไฟล์ประมวลผลข้อมูลนั้นในบางวิธีและเขียนผลลัพธ์ไปยังไฟล์ ถ้าฉันพบว่าตัวเองกำลังใช้ (ใน Perl) systemคำสั่ง, ติ๊กเห็บหรือ (เป็นไพ ธ อน) subprocessโมดูลมากเกินไปฉันจะพิจารณาเขียนสคริปต์ใน bash ในทางกลับกันบางครั้งฉันก็เริ่มเพิ่มฟังก์ชั่นมากมายให้กับสคริปต์ทุบตีในที่สุดมันก็เหมาะสมกว่าที่จะเขียนมันใหม่ใน Perl / python แทนที่จะจัดการกับการสนับสนุน จำกัด ของ bash (โดยการเปรียบเทียบ) สำหรับการกำหนดขอบเขตตัวแปรฟังก์ชันโครงสร้างข้อมูล ฯลฯ .


2
ฉันใช้ t0 และประกันตัวใน Bash เมื่อใดก็ตามที่ต้องการการอ่านไฟล์ / การสร้างข้อความ แต่หลังจากเรียนรู้=~ผู้ดำเนินการที่ได้รับการสนับสนุน[[ ]]ฉันรัก Bash บางอย่างสำหรับการอ่านไฟล์อย่างง่าย
Freedom_Ben

16

ฉันชอบเกณฑ์ที่กำหนดไว้ในโพสต์บล็อกนี้

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

8

ฉันพบว่าการวิเคราะห์ Perl กับ Bash นี้มีประโยชน์ ...

http://blogs.perl.org/users/buddy_burden/2012/04/perl-vs-shell-scripts.html

เพื่อความสะดวกฉันกำลังคัดลอกบทสรุปของผู้เขียน 1) เมื่อ bash เป็นข้อค้นพบที่ดีกว่าและ 2) เมื่อ perl เป็นข้อสรุปที่ดีกว่า ...

เมื่อ Bash ดีกว่า ...

  • งานล้มเหลว
  • คำสั่งเมื่อออก
  • การประมวลผลสายงานเอาท์พุท
  • เอกสารที่นี่
  • ไฟล์เทียบเท่า
  • เปรียบเทียบไฟล์ Timestamp
  • Tilde Expansion

เมื่อ Perl ดีกว่า ...

Perl ยังคงเต้นอึออกจากทุบตีสำหรับการใช้งานมากที่สุด เหตุผลที่ฉันอาจชอบ Perl รวมถึง (แต่ไม่ จำกัด เฉพาะ):

  • มันจะเร็วขึ้น ส่วนใหญ่เป็นเพราะฉันไม่จำเป็นต้องเริ่มกระบวนการใหม่สำหรับสิ่งต่าง ๆ ที่ฉันต้องการ (basename และ dirname เป็นตัวอย่างที่ชัดเจนที่สุด แต่โดยทั่วไปแล้วสามารถตัด grep, sort และ wc ได้เช่นกัน)
  • การจัดการสตริงใน bash นั้นดีที่สุดและสิ่งที่ $ IFS ทั้งหมดนั้นยอดเยี่ยมมาก
  • เงื่อนไขในเชลล์สคริปต์อาจไม่ชัด
  • การอ้างถึงเชลล์สคริปต์อาจเป็นฝันร้าย
  • คำสั่ง case ของ bash ทำให้คุณต้องการมากกว่าเคสธรรมดา (NPI)
  • อาร์เรย์ในทุบตีดูด Hash ใน bash (สมมติว่า bash ของคุณใหม่พอที่จะให้มันดูด) ได้ยากขึ้น
  • เมื่อประมวลผลไฟล์หรือเอาท์พุทคำสั่งนอกเหนือไปจากกรณีง่าย ๆ ที่ฉันได้กล่าวไว้ข้างต้นแล้ว Perl ก็จะเริ่มสูบบุหรี่
  • CPAN

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


น่าสนใจใน Ruby ไม่ใช้คะแนนทั้งหมด (?) เนื่องจาก Ruby มี at_exit (), realpath (), expand_path (), stat (), heredocs และข้อยกเว้น ( fail "error" unless system("foobar"))
Cezary Baginski

5

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

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

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


4

Bash เป็น Unix shell มันมีภาษาสคริปต์ มันค่อนข้างประมวลผลคำสั่ง คุณควบคุมวิธีที่คุณใช้คำสั่งคุณใช้งานจริง

Perl / Ruby / Python เป็นภาษาวัตถุประสงค์ทั่วไป

เมื่อคุณต้องการเชลล์สคริปต์คุณใช้ Bash

ถ้าคุณต้องการงานที่ซับซ้อนมากขึ้นหรือไม่เกี่ยวข้องกับเชลล์ ใช้ Python และอื่น ๆ

ฉันจะไม่เปรียบเทียบภาษาเหล่านี้จริง ๆ Python ฯลฯ เป็นแบบพกพา คุณสามารถเรียกใช้ได้ทุกที่ Bash สำหรับ Unix เท่านั้น

Python และอื่น ๆ มีไลบรารีที่สามารถใช้ซ้ำได้มากมายเพื่อแก้ไขงานนับล้าน

มันเกือบจะเหมือนกันถ้าคุณถาม "เมื่อใดควรใช้ 'ระบายสี' และเมื่อใช้ Photoshop '

สำหรับการประมวลผลอีเมลฉันจะใช้ Ruby อีกครั้งเพราะมีไลบรารีที่ใช้ซ้ำได้จำนวนมาก

แต่วิธีที่ดีที่สุดคือการรวมทุบตีและทับทิม นั่นจะเป็นสิ่งที่ถูกต้อง เช่นเดียวกับที่คุณสร้างสคริปต์การประมวลผลอีเมลใน ruby ​​และ bash script จะเรียกใช้สคริปต์ ruby ​​นั้นและเรียกใช้คำสั่งอื่น ๆ

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

อัปเดตหลังจาก 7 ปี (มี.ค. 2019)

ในขณะที่ส่วนหลักของคำตอบของฉันไม่เปลี่ยนแปลงฉันต้องการจะชี้ให้เห็นว่า

Bash เป็นภาษาสคริปต์ที่ทรงพลังเช่นกัน สำหรับการประมวลผลข้อความมันอาจเป็นตัวเลือกที่ถูกต้องแน่นอน

โปรดอ่านความคิดเห็นของ mkaito ด้านล่าง พวกเขาทั้งหมดเป็นความจริงอย่างสมบูรณ์


1
ชุดการสคริปต์ของ Bash นั้นมีวัตถุประสงค์ทั่วไปเหมือนกับภาษาสคริปต์วัตถุประสงค์ทั่วไป เพิ่มโปรแกรมทั่วไปเช่นซึมซาบเข้าด้วยกันและคุณมี 90% ของความต้องการสคริปต์ทั้งหมดที่คุณมี
mkaito

1
bash เป็นตัวประมวลผลคำสั่งดังนั้นพลังงานของมันคือการเรียกใช้คำสั่ง unix และโปรแกรมอื่น ๆ ในสคริปต์ของพวกเขาเช่นที่คุณพูดถึง sed ฯลฯ เขากำลังขอเวลาที่จะเลือกภาษาที่แน่นอน
bakytn

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

ฉันสามารถนอนบนพื้น แต่ฉันอยากจะทำมันบนเตียง เปรียบเทียบภาษาไม่ได้พวกเขามีจุดประสงค์ที่แตกต่างกัน
bakytn

2
ดีถ้าทุบตีพื้นบางอย่างเช่น Haskell จะต้องเป็น :-) nailboard
mkaito

1

สคริปต์ของเชลล์เช่น bash, ksh, zsh, sh และ fish นั้นน่าประหลาดใจอย่างมากเมื่อเทียบกับภาษาที่ใช้งานทั่วไประดับสูงอย่าง Ruby, Python หรือ Perl ในขณะที่เชลล์สคริปอาจเริ่มต้นชีวิตของมันในฐานะไฟล์ที่สั้นกว่าสคริปต์เอนกประสงค์ที่เทียบเท่ากัน แต่ความประหลาดใจนำไปสู่การตัดโค้ดป้องกันจำนวนมากเช่นset -euo pipefailเพื่อเปิดใช้งานโหมดที่เข้มงวด

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


1

บทความที่มีอคติสูง

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

ฉันรันสคริปต์ทุบตีบนลำดับดีเอ็นเอนับล้านอ่านเป็นพันไฟล์และมันก็ใช้ได้ดี ตรงกันข้ามกับที่ทุกคนพูดว่าสคริปต์เวอร์ชันเดียวกันใน C ++ ไม่ได้รันทุกสิ่งที่เร็วกว่านั้นมากนัก (แยกกันไม่กี่นาที)

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


0

จาก "Llama Book"

Perl พยายามเติมช่องว่างระหว่างการเขียนโปรแกรมระดับต่ำ (เช่นใน C หรือ C ++ หรือชุดประกอบ) และการเขียนโปรแกรมระดับสูง (เช่นการเขียนโปรแกรม“ shell” [เช่น, bash]) การเขียนโปรแกรมระดับต่ำมักเขียนยากและน่าเกลียด แต่รวดเร็วและไม่ จำกัด มันยากที่จะเอาชนะความเร็วของโปรแกรมระดับล่างที่เขียนได้ดีบนเครื่องที่กำหนด และมีไม่มากที่คุณทำไม่ได้ การเขียนโปรแกรมระดับสูงที่สุดโต่งอื่น ๆ มีแนวโน้มที่จะช้าแข็งน่าเกลียดและ จำกัด ; มีหลายสิ่งที่คุณไม่สามารถทำได้เลยด้วยการเขียนโปรแกรมเชลล์หรือแบทช์หากไม่มีคำสั่งในระบบของคุณที่ให้การทำงานที่จำเป็น Perl เป็นเรื่องง่ายเกือบไม่ จำกัด ส่วนใหญ่เร็วและน่าเกลียด


0

ตามกฎของหัวแม่มือใช้ภาษาที่ง่ายที่สุดที่มีประสิทธิภาพเพียงพอสำหรับงานของคุณ และลักษณะเฉพาะของการขยายพวกเขามีประโยชน์อย่างแท้จริง

และเกี่ยวกับความสามารถในการอ่าน Bash นั้นแย่มากถ้าสไตล์การเขียนโปรแกรมของคุณแย่มาก หากคุณเพิ่งโยนรหัสไปที่นั่นมันจะคลุมเครือ

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

นี่คือรหัสล่าสุดของฉันใน Bash สังเกตว่าเข้าใจง่ายและพิมพ์อย่างไร:

#! /bin/bash


mainFunction () {
    file="${1}"

    checkFile "${file}"
    executeFile "${file}"
}


changeToThisProgramDir () {
    cd "$( dirname "${BASH_SOURCE[0]}" )"
}


checkFile () {
    file="${1}"

    checkFileNotEmpty "${file}"
    checkFileExist "${file}"
    checkFileIsExe "${file}"
}


checkFileExist () {
    file="${1}"

    if [ ! -f "${file}" ]; then
        echo "The file doesn't exist: ${file}" >&2
        echo "If the name was correct either type: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}


checkFileIsExe () {
    file="${1}"
    mime=$(fileMime "${file}")

    if [ "${mime}" != "application/x-dosexec" ]; then
        echo "Not an exe: ${file}" >&2
        exit 1
    fi
}


checkFileNotEmpty () {
    file="${1}"

    if [ "${file}" == "" ]; then
        echo "No file specified" >&2
        echo "Either type this: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}


execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: ${error}" >&2
        exit 1
    fi
}


executeFile () {
    file="${1}"
    type=$(fileType "${file}")

    if [ "${type}" == "MS-DOS executable" ]; then
        execute "executeFile" "dosbox \"${file}\" -forcescaler normal2x -exit -fullscreen"
    else
        execute "executeFile" "wine \"${file}\""
    fi
}


fileMime () {
    file="${1}"

    attributes=$(file --brief --mime "${file}")
    IFS=";" read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}


fileType () {
    file="${1}"

    attributes=$(file --brief "${file}")
    IFS="," read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}


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