6 คะแนน โดย GN⁺ 2025-03-23 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ยูทิลิตีบรรทัดคำสั่งจำนวนมากรองรับทั้งตัวเลือกแบบสั้น(-f)และตัวเลือกแบบยาว(--force)
  • แบบสั้นมีไว้สำหรับการใช้งานเชิงโต้ตอบ และแนะนำให้ใช้แบบยาวในสคริปต์
  • ตัวอย่างเช่น ในเทอร์มินัลเราจะพิมพ์ $ git switch -c my-new-branch
  • แต่ในสคริปต์สำหรับรีลีสจะเขียนดังนี้:
    • try shell.exec("git fetch origin --quiet", .{});
    • try shell.exec("git switch --create release-{today} origin/main", .{ .today = stdx.DateUTC.now() }, );
  • ตัวเลือกแบบยาวอธิบายความหมายให้ผู้อ่านได้ชัดเจนกว่ามาก

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

 
GN⁺ 2025-03-23
ความคิดเห็นจาก Hacker News
  • ชอบใช้ตัวเลือกแบบยาว แต่เมื่อจำเป็นต้องเรียกคำสั่ง POSIX ให้พกพาได้ ตัวเลือกแบบสั้นคือทางเลือกเดียว เพราะ POSIX ไม่ได้ระบุตัวเลือกแบบยาว

    • ตัวอย่างเช่น สามารถอ้างอิงสเปกของ diff ได้
    • ในหลายกรณี การใช้ไลบรารีไบน์ดิงเป็นทางเลือกที่ดีกว่าการพึ่งพา POSIX utility
    • แทนที่จะเรียก grep การใช้บางอย่างอย่าง libpcre อาจมีประสิทธิภาพกว่า
    • สำหรับ utility ที่ไม่ใช่ POSIX เช่น git, hg, rg, ag การใช้ตัวเลือกแบบยาวถือว่าสมเหตุสมผล
  • ไม่ควรผสม string interpolation กับการรันคำสั่ง

    • โดยเฉพาะเมื่อคำสั่งถูกประมวลผลผ่านเชลล์ ต้องระวังเป็นพิเศษ
    • ไม่ว่าจะภาษาใดก็ควรใช้ API สำหรับการรันแบบลิสต์หรือแบบอาร์เรย์ เพื่อส่งอาร์กิวเมนต์ตรงไปยัง execv(2), execvp(2) เป็นต้น
  • เห็นด้วยว่าควรใช้ตัวเลือกแบบยาว แต่ก็ต้องคำนึงถึงความพกพาได้

    • BSD distribution ไม่ได้ทุกตัวรองรับตัวเลือกแบบยาวสไตล์ GNU
    • ถ้าต้องการความพกพาได้ ก็ควรใช้ตัวเลือกแบบสั้น
  • อย่าลืมใช้ -- หลังตัวเลือกทั้งหมด และก่อนอาร์กิวเมนต์แบบไดนามิก

  • ควรตรวจสอบก่อนเรียกคำสั่งว่าความยาวของคำสั่งเกิน ARG_MAX หรือไม่

    • ตัวอย่างเช่น เมื่อมีคำสั่งแบบนี้:
      • grep --ignore-case --files-with-matches -- "hello" *.c
    • ควรเรียกแบบนี้:
      • CMD="grep --ignore-case --files-with-matches -- \"hello\" *.c"
      • ARG_MAX=$(getconf ARG_MAX)
      • CMD_LEN=${#CMD}
      • if (( CMD_LEN > ARG_MAX )); then
      • echo "Error: Command length ($CMD_LEN) exceeds ARG_MAX ($ARG_MAX)." >&2
      • exit 1
      • fi
      • eval "$CMD" # คำเตือน: ประเมินชื่อไฟล์
  • เห็นด้วยกับวิธีนี้ อีกข้อดีคือค้นหาใน man page ได้ง่ายขึ้นว่าตัวเลือกนั้นทำอะไร

  • ถ้าต้องการให้สคริปต์พกพาไปยังระบบ POSIX อื่นได้ อาจจำเป็นต้องใช้ตัวเลือกแบบสั้น

    • ตัวเลือกแบบยาวยังไม่ได้รับการทำให้เป็นมาตรฐาน
    • ต้องตัดสินใจ trade-off ด้วยตัวเอง
  • ควรวางตัวเลือกไว้คนละบรรทัด เพื่อให้ติดตามและ git blame ได้ง่าย

  • นี่เป็นหนึ่งในกฎพื้นฐานเวลาเขียนสคริปต์ ถ้าใช้ตัวเลือกแบบยาวได้ก็ควรใช้

    • มันสมเหตุสมผลมาก
  • ตัวเลือกแบบยาวอ่านแล้วอธิบายความหมายให้ผู้อ่านได้มากกว่า

    • พิมพ์ผิดน้อยกว่า