Ruby ภาษาที่ยอดเยี่ยมสำหรับเชลล์สคริปต์
(lucasoshiro.github.io)- ผู้คนมักเชื่อมโยง Ruby เข้ากับเฟรมเวิร์ก Rails เป็นหลัก จนลืมจุดเด่นที่ยอดเยี่ยมของภาษานี้ไป
- Ruby เป็นภาษาที่สมบูรณ์และมีความสามารถรอบด้านมาก โดยเฉพาะมีประโยชน์เมื่อต้องเขียนเชลล์สคริปต์ที่ซับซ้อน
- เป้าหมายของบทความนี้
- แสดงความสามารถของ Ruby ที่มีประโยชน์เวลาเขียนเชลล์สคริปต์ และเปรียบเทียบกับ Bash และ Python
- ไม่ได้หมายความว่าจะให้แทนที่ Bash script ด้วย Ruby script ทั้งหมด
ความสามารถ 1: เรียกใช้คำสั่งภายนอก
- ใน Ruby การเรียกใช้คำสั่งภายนอกใช้ backtick(```)
- ตัวอย่างเช่น เมื่อใช้ backtick สามารถเก็บผลลัพธ์ของคำสั่งภายนอกไว้ในตัวแปรได้
- สามารถใช้
systemหรือpopenได้เช่นกัน`ls` - สามารถเก็บผลลัพธ์ของคำสั่งไว้ในตัวแปรได้
my_date=`date`
ความสามารถ 2: รหัสสถานะ
- สามารถใช้ตัวแปร
$?เพื่อตรวจสอบรหัสสถานะของคำสั่งล่าสุดได้ - คล้ายกับ Bash มาก
`true` puts $? # 0 `false` puts $? # 1
ความสามารถ 3: ภาษาแบบมีชนิดข้อมูล
- Ruby ไม่ใช่ภาษาที่มีชนิดข้อมูลแบบสแตติก แต่ก็มีชนิดข้อมูล
- เป็นภาษาเชิงวัตถุ โดยทุกอย่างถูกปฏิบัติเป็นออบเจ็กต์
- ต่างจาก Bash ตรงที่สามารถใช้ชนิดข้อมูลอื่นนอกเหนือจากสตริงได้อย่างปลอดภัย
total_lines = `wc -l my_file`.to_i # จำนวนเต็มที่เก็บจำนวนบรรทัดของไฟล์ half = total_lines.div 2 # การหารจำนวนเต็ม puts `head -n #{half} my_file` # แสดงครึ่งหนึ่งของไฟล์
ความสามารถ 4: การประกอบแบบฟังก์ชัน
- Ruby มีโอเปอเรชันเชิงฟังก์ชันอย่าง
map,select(filter),reduce,flat_mapในรูปแบบเมธอด - สามารถใช้
mapกับผลลัพธ์ของคำสั่งได้puts `ls`.lines.map { |name| name.strip.length } # แสดงความยาวของชื่อไฟล์
ความสามารถ 5: การแมตช์ด้วย regular expression
- ใน Ruby regular expression เป็นชนิดข้อมูล และมีโอเปอเรชันที่ใช้ regular expression ติดมากับภาษา
- ตัวอย่างเช่น วิธีดึงชื่อ git branch ปัจจุบัน:
current_branch_regex = /^\* (\S+)/ output_lines = `git branch`.lines output_lines.each do |line| if line =~ current_branch_regex # แมตช์ระหว่างสตริงกับ regular expression puts $1 # แสดงผลลัพธ์ที่แมตช์ของกลุ่มแรก end end
ความสามารถ 6: เธรดที่ใช้งานง่าย
- Ruby ทำให้การจัดการหลายเธรดเป็นเรื่องง่ายมาก
- ตัวอย่างเช่น มีประโยชน์เมื่อดาวน์โหลดหลายไฟล์พร้อมกัน
(1..10).map do |i| # วนซ้ำตั้งแต่ 1 ถึง 10 Thread.new do `wget http://my_site.com/file_#{i}` # สามารถใช้ตัวแปรภายในคำสั่งได้ end end.each { |thread| thread.join } # do/end และวงเล็บปีกกามีจุดประสงค์เดียวกัน
ความสามารถ 7: งานไฟล์และไดเรกทอรีที่มีมาในตัว
- ใน Ruby การจัดการไฟล์ทั้งหมดมีให้ผ่านเมธอดของคลาส
Fileและการจัดการไดเรกทอรีผ่านเมธอดของคลาสDir - ต่างจาก Python ตรงที่สามารถจัดการไฟล์และไดเรกทอรีได้อย่างสม่ำเสมอในแนวทางเดียวกัน
exists = File.exists? 'My File' # เมธอดที่คืนค่า boolean จะลงท้ายด้วย '?' file_content = File.open('My File').read File.delete 'My File' # หากไม่กำกวม วงเล็บเป็นสิ่งที่ใส่หรือไม่ใส่ก็ได้
บทสรุป
- แนะนำให้พิจารณา Ruby เมื่อต้องการแทนที่เชลล์สคริปต์ที่ซับซ้อน
- แน่นอนว่าไม่ได้หมายความให้เลิกใช้ Bash ไปเลย แต่ในงานที่ซับซ้อน Ruby อาจเป็นตัวเลือกที่ดีกว่า
- แม้จะทำได้ด้วย Python, Perl, JS เป็นต้น แต่ในมุมมองส่วนตัว Ruby คือภาษาที่สมบูรณ์ที่สุดและใช้งานง่ายที่สุด
ความเห็นของ GN⁺
- Ruby รองรับทั้งการเขียนโปรแกรมเชิงวัตถุและเชิงฟังก์ชัน จึงรองรับสไตล์การเขียนโปรแกรมที่หลากหลายได้
- เมื่อเทียบกับ Python แล้ว Ruby ยึดตามกระบวนทัศน์เชิงวัตถุที่เข้มงวดกว่า
- เมื่อเขียนเชลล์สคริปต์ ยิ่งความซับซ้อนสูงขึ้น จุดเด่นของ Ruby ก็ยิ่งชัดเจน
- ความสามารถด้านการจัดการเธรดของ Ruby ช่วยให้ทำงานแบบขนานได้ง่าย
- งานไฟล์และไดเรกทอรีถูกจัดเตรียมไว้อย่างเป็นธรรมชาติและสม่ำเสมอ ช่วยเพิ่มผลิตภาพ
3 ความคิดเห็น
เอามาใช้ทำสคริปต์ก็ดูโอเคนะ 555 ไม่รู้ว่าเป็นเวอร์ชันไหน แต่บน Mac ก็ติดตั้งมาให้เป็นค่าเริ่มต้นอยู่แล้วไม่ใช่เหรอ,,?!
Ruby ที่เคยชื่นชอบมาก่อน... หวังว่ามันจะยังคงเป็นภาษาที่ได้รับความรักมากในแบบนี้ต่อไปนะครับ/ค่ะ
ความคิดเห็นบน Hacker News
binding.irbหรือbinding.pryPathnameให้ API ที่เป็นธรรมชาติกว่าFileParallelก็จะทำให้การประมวลผลแบบขนานสะดวกยิ่งขึ้น