3 คะแนน โดย GN⁺ 2023-11-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ไฟล์ไบนารีที่น่าสนใจในระบบ Unix

  • ในระบบ Unix มีไฟล์ไบนารีที่มีชื่อเป็นสัญลักษณ์เดี่ยวอยู่
  • หากรันคำสั่ง /bin/[ จะพบว่าเป็นโปรแกรมที่ชื่อว่า [
  • [ และ test ชี้ไปยังไฟล์ไบนารีเดียวกัน และทั้งสองคำสั่งก็ทำงานเดียวกันจริง ๆ

การใช้งานโปรแกรม test และ [

  • โปรแกรม test ใช้สำหรับประเมินนิพจน์ในเชลล์
  • ใช้สำหรับการเปรียบเทียบสตริง การเปรียบเทียบตัวเลข การตรวจสอบเงื่อนไขของไฟล์ เป็นต้น
  • test รับอาร์กิวเมนต์เพื่อนำมาประเมินนิพจน์ และจะคืนค่า 0 ถ้าเป็นจริง และ 1 ถ้าเป็นเท็จ

เหตุผลที่มีสองคำสั่งนี้อยู่

  • เหตุผลที่มีทั้ง test และ [ ยังไม่ชัดเจน แต่คาดว่าเพื่อช่วยให้อ่านโค้ดได้ง่ายขึ้น
  • การใช้คำสั่ง [ ทำให้เขียนเงื่อนไขได้ดูสะอาดกว่า test
  • เมื่อใช้ [ อาร์กิวเมนต์สุดท้ายของคำสั่งต้องลงท้ายด้วย ]

ความแตกต่างระหว่างคำสั่ง built-in กับไฟล์ไบนารีภายนอก

  • เนื่องจาก test และ [ ถูกใช้บ่อยในเชลล์สคริปต์ จึงถูกทำเป็นคำสั่ง built-in ในเชลล์ส่วนใหญ่
  • การใช้ built-in กับไฟล์ไบนารีภายนอกอาจแสดงพฤติกรรมต่างกัน และความแตกต่างนี้ก็อาจขึ้นอยู่กับเชลล์ที่ใช้ด้วย

การใช้ [[ และความแตกต่าง

  • [[ เป็นส่วนขยายของ Bash ที่ใช้แทนการใช้งาน [
  • [[ เป็นคำสั่ง built-in ที่สามารถเปลี่ยนกฎพื้นฐานของภาษาได้ภายในนิพจน์
  • [[ อาจให้ผลลัพธ์ต่างออกไป เพราะในการเปรียบเทียบสตริง มันปฏิบัติต่อ glob pattern แบบ literal

การเลือกใช้เมื่อเขียนเชลล์สคริปต์

  • หากต้องการเขียนเชลล์สคริปต์ที่พกพาได้ ควรใช้ [
  • หากเขียนสคริปต์ที่ใช้เฉพาะ Bash การใช้ [[ จะให้ความสามารถมากกว่า

การรวม shell expression กับ test expression

  • เชลล์มีนิพจน์ของตัวเองผ่านโอเปอเรเตอร์ !, &&, ||
  • สามารถรวม test expression และ shell expression ให้เป็นคำสั่งเดียวได้

ความเห็นของ GN⁺

ประเด็นสำคัญที่สุดของบทความนี้คือ ในระบบ Unix นั้น [ และ test มีอยู่ในฐานะสองคำสั่งที่ต่างชื่อกันแต่ทำงานเหมือนกัน ซึ่งคาดว่าเป็นไปเพื่อเพิ่มทั้งความอ่านง่ายและประสิทธิภาพในการเขียนเชลล์สคริปต์ ข้อมูลนี้มีประโยชน์สำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้นที่ต้องเขียนหรือทำความเข้าใจเชลล์สคริปต์ และยังช่วยให้เข้าใจหลักการทำงานของเชลล์สคริปต์รวมถึงความแตกต่างระหว่างเชลล์แต่ละแบบได้ดีขึ้น เหตุผลที่บทความนี้น่าสนใจก็คือ มันแสดงให้เห็นว่าเครื่องมือพื้นฐานของเชลล์สคริปต์สามารถถูกใช้งานได้หลากหลายรูปแบบอย่างไร และสะท้อนให้เห็นทั้งความซับซ้อนและความยืดหยุ่นของการเขียนโปรแกรมเชลล์ได้เป็นอย่างดี

1 ความคิดเห็น

 
GN⁺ 2023-11-24
ความเห็นจาก Hacker News
  • คำขอบคุณจากผู้เขียนต้นฉบับและข้อเสนอให้แก้ชื่อเรื่อง

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

  • ประวัติของคำสั่ง "test" ใน Bourne shell และความชอบส่วนตัว

    อธิบายว่า Bourne shell ถูกสร้างขึ้นในยุคที่ยังไม่มี IDE จึงมีการใช้คำสั่ง "test" โดยไม่มีวงเล็บหรือวงเล็บเหลี่ยม และโดยส่วนตัวชอบรูปแบบ "test" มากกว่ารูปแบบวงเล็บเหลี่ยม

  • ตัวอย่างเงื่อนไขที่ไม่ใช้บล็อก if

    แนะนำวิธีเขียนเงื่อนไขแบบสั้น ๆ โดยไม่ใช้บล็อก if พร้อมยกตัวอย่างการพิมพ์ข้อความดีบักไปยัง stderr แบบมีเงื่อนไข

  • วิธีใช้บล็อก if ร่วมกับคำสั่งทั่วไป

    แสดงให้เห็นว่าบล็อก if สามารถใช้ทดสอบคำสั่งทั่วไปได้ โดยยกตัวอย่างการค้นหา log ด้วยคำสั่ง grep

  • ข้อกังวลเกี่ยวกับการใช้ตัวดำเนินการตรรกะในคำสั่ง test

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

  • ข้อดีของการใช้คำสั่ง "test" และความสะดวกของ "man test"

    ระบุว่าตั้งแต่หลายปีก่อนก็สนับสนุนให้ใช้คำสั่ง "test" โดยไม่ใช้วงเล็บเหลี่ยม เพราะช่วยเน้นว่า "test" เป็นเพียงคำสั่งธรรมดา และการใช้ "man test" ก็สะดวกกว่าการไปค้นใน "man bash"

  • ข้อควรระวังเกี่ยวกับพฤติกรรมของ [ และ test เมื่อมีอาร์กิวเมนต์เดียว

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

  • ความแตกต่างของ /bin/[ และ /bin/test บน Linux และ NetBSD

    แชร์ว่าบน Linux นั้น /bin/[ กับ /bin/test ต่างกัน แต่บน NetBSD นั้นเหมือนกัน

  • แชร์ลิงก์บล็อกสำหรับศึกษา test/[/[[ ให้ลึกขึ้น และจุดแปลก ๆ ของ shell

    แชร์เอกสารที่ช่วยให้เข้าใจ test, [, [[ ได้ลึกขึ้น รวมถึงลิงก์บล็อกที่อธิบายคุณลักษณะต่าง ๆ ของ shell

  • ชี้ว่า [[ เป็นคำสั่งเฉพาะของ bash และแนะนำให้ใช้เมื่อมั่นใจว่าใช้ bash

    กล่าวถึงว่า [[ เป็นคำสั่งเฉพาะของ bash และแนะนำว่าหากแน่ใจว่าใช้ bash ก็ควรใช้ [[

  • ความสับสนต่อการรับรู้ว่า [ ไม่ได้เป็นส่วนหนึ่งของภาษา bash scripting

    บอกว่ารู้สึกสับสนกับการทำความเข้าใจว่า [ ไม่ได้เป็นส่วนหนึ่งของภาษา bash scripting แต่เป็นเพียงโปรแกรมธรรมดา และขอคำอธิบายเกี่ยวกับเรื่องนี้

  • ความเห็นที่ชัดเจนต่อ shell และการคัดค้านการใช้ [

    แสดงความเห็นอย่างหนักแน่นว่าไม่ควรใช้ [ และควรใช้เพียง "test" เท่านั้น โดยเน้นว่า [ ดูเหมือนไวยากรณ์ของภาษา แต่จริง ๆ แล้วเป็นโปรแกรม และยังโต้แย้งว่าควรใช้คำสั่ง case สำหรับการประเมินสตริง