13 คะแนน โดย GN⁺ 2023-06-28 | 5 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้แค่ Terminal ก็จัดการ ความสามารถเฉพาะของ macOS อย่างโหมดพัก, คลิปบอร์ด, Finder, Spotlight และการอัปเดตได้ จึงช่วยลดงานซ้ำ ๆ บน GUI
  • caffeinate, pmset, taskpolicy ส่งผลโดยตรงต่อ การทำงานของระบบ เช่น ป้องกันการพักเครื่อง ตรวจสอบสถานะพลังงาน และปรับลำดับความสำคัญในการรันโปรเซส
  • ใช้ pbcopy, pbpaste, open, screencapture, say เพื่อใส่งานประจำวันอย่างคลิปบอร์ด การเปิดไฟล์ การจับภาพหน้าจอ และการพูดข้อความ ลงในสคริปต์ได้ง่าย
  • sips, textutil, mdfind, mdls ใช้เป็น เครื่องมือจัดการไฟล์ เพื่อทำงานอัตโนมัติ เช่น แปลงรูปภาพและเอกสาร ค้นหาด้วย Spotlight และตรวจสอบเมทาดาทา
  • networkQuality, networksetup, softwareupdate, system_profiler ช่วยตรวจสอบคุณภาพเครือข่าย, Wi‑Fi/DNS, การอัปเดต OS และข้อมูลฮาร์ดแวร์·ซอฟต์แวร์ได้อย่างรวดเร็ว

ขอบเขตของคำสั่งเฉพาะบน macOS

  • นอกจากเครื่องมือ Unix มาตรฐานแล้ว macOS ยังมี เครื่องมือบรรทัดคำสั่งเฉพาะทาง สำหรับเข้าถึงความสามารถของระบบปฏิบัติการ
  • ดูวิธีใช้แบบละเอียดของแต่ละคำสั่งได้ด้วย man <command>
  • สภาพแวดล้อมอ้างอิงคือ macOS Sonoma

พลังงาน, โหมดพัก, การควบคุมโปรเซส

  • caffeinate - ป้องกัน Mac เข้าสู่โหมดพัก

    • หากรัน caffeinate โดยไม่ใส่แฟล็กหรืออาร์กิวเมนต์ Mac จะไม่เข้าสู่โหมดพักตราบใดที่คำสั่งยังทำงานอยู่
    • caffeinate -u -t <seconds> ใช้ การป้องกันโหมดพัก ตามจำนวนวินาทีที่กำหนด
    • หากเพิ่มแฟล็ก -d จะป้องกันไม่ให้หน้าจอพักด้วย
    • หากระบุโปรเซสที่มีอยู่แล้วด้วย -w <pid> caffeinate จะจบการทำงานเมื่อโปรเซสนั้นสิ้นสุด
    • caffeinate <command> จะเริ่มคำสั่งที่กำหนดเป็นโปรเซสใหม่ และป้องกันโหมดพักจนกว่าโปรเซสนั้นจะสิ้นสุด
  • pmset - ตรวจสอบและควบคุมสถานะการจัดการพลังงาน

    • pmset -g แสดง ข้อมูลการตั้งค่าพลังงาน ที่ใช้งานได้
    • pmset -g assertions แสดง assertion ที่เกี่ยวกับพลังงานซึ่งถูกสร้างโดยโปรเซสอื่น จึงมีประโยชน์ในการหาโปรเซสที่ขัดขวางไม่ให้ Mac เข้าสู่โหมดพัก
    • pmset -g thermlog แสดงข้อมูลโปรเซสที่ถูก throttling ซึ่งใช้ประกอบการรันเบนช์มาร์กได้
    • pmset displaysleepnow ทำให้เฉพาะหน้าจอเข้าสู่โหมดพักทันที โดยไม่ทำให้ทั้งระบบพัก
    • pmset sleepnow ทำให้ทั้งระบบเข้าสู่โหมดพักทันที
  • taskpolicy - ควบคุมการจัดตารางโปรเซส

    • taskpolicy -b <command> รันคำสั่งที่กำหนดใน โหมดเบื้องหลัง และบน Mac ที่ใช้ Apple silicon จะรันบน efficiency core เท่านั้น
    • taskpolicy -b -p <pid> ลดโปรเซสที่มีอยู่แล้วให้รันแบบเบื้องหลัง
    • taskpolicy -B -p <pid> ยกเลิกสถานะรันแบบเบื้องหลังของโปรเซสที่กำหนด
      • บน Mac ที่ใช้ Apple silicon หลังจากนั้นโปรเซสอาจรันบน efficiency core หรือ performance core ก็ได้
      • พฤติกรรมนี้ใช้ได้เฉพาะกับโปรเซสที่ถูกลดลงเป็นเบื้องหลังภายหลังเท่านั้น และใช้ไม่ได้กับโปรเซสที่เริ่มต้นมาในโหมดเบื้องหลังตั้งแต่แรก
    • taskpolicy -s <command> เริ่มคำสั่งที่กำหนดใน สถานะหยุดชั่วคราว เพื่อให้สามารถแนบดีบักเกอร์ตั้งแต่จังหวะเริ่มรันได้

คลิปบอร์ด, การเปิดแอป, การจับภาพหน้าจอ, การพูดข้อความ

  • pbcopy, pbpaste - ใช้คลิปบอร์ดของระบบ

    • <command> | pbcopy คัดลอกผลลัพธ์ของคำสั่งไปยัง คลิปบอร์ด
    • pbpaste ส่งออกเนื้อหาในคลิปบอร์ดไปยัง standard output
  • open - เปิดไฟล์และแอปพลิเคชัน

    • open -a <app> <file> เปิดไฟล์ที่กำหนดด้วยแอปพลิเคชันที่ระบุ
    • หากเพิ่มแฟล็ก -g จะเปิดไฟล์ ในเบื้องหลัง โดยยังคงโฟกัสอยู่ที่แอปปัจจุบัน
    • open . เปิดไดเรกทอรีปัจจุบันเป็นหน้าต่าง Finder ใหม่
    • open -R <file> แสดงไฟล์ที่กำหนดในหน้าต่าง Finder ใหม่
  • screencapture - จับภาพหน้าจอ

    • screencapture -c จับภาพหน้าจอแล้วคัดลอกไปยัง คลิปบอร์ด
    • screencapture <file> บันทึกภาพหน้าจอลงไฟล์ที่กำหนด
    • หากเพิ่มแฟล็ก -T <seconds> จะรอตามจำนวนวินาทีที่กำหนดก่อนค่อยจับภาพ
  • say - แปลงข้อความเป็นเสียงพูด

    • say <message> อ่านข้อความที่กำหนดออกเสียง
    • say -f input.txt -o output.aiff สร้าง หนังสือเสียง จากไฟล์ข้อความที่ระบุ

รูปภาพ, เอกสาร, การค้นหาและเมทาดาทา

  • sips - จัดการรูปภาพ

    • sips -z <height> <width> <image> ปรับขนาดรูปภาพเป็นขนาดที่กำหนดโดยไม่สนอัตราส่วนเดิม
    • sips -Z <size> <image> ปรับด้านที่ยาวที่สุดให้มีขนาดตามที่กำหนดโดยคงอัตราส่วนเดิมไว้
    • sips -c <height> <width> <image> ครอป รูปภาพเป็นขนาดที่กำหนดโดยอิงจากกึ่งกลางของรูปต้นฉบับ
    • sips -r <degrees> <image> หมุนรูปภาพตามองศาที่กำหนด
    • พฤติกรรมเริ่มต้นคือ เขียนทับแบบทำลายข้อมูลเดิม บนรูปต้นฉบับ ดังนั้นหากต้องการพาธเอาต์พุตอื่นให้ใช้แฟล็ก -o
    • ไฟล์เอาต์พุตต้องใช้นามสกุลไฟล์เดียวกับรูปต้นฉบับ
  • textutil - แปลงไฟล์เอกสาร

    • textutil สามารถแปลงไฟล์ระหว่างฟอร์แมต Microsoft Word, plain text, rich text และ HTML ได้
    • textutil -convert html journal.doc แปลง journal.doc เป็น journal.html
    • ค่าที่ใช้กับ -convert ได้คือ txt, html, rtf, rtfd, doc, docx
  • mdfind, mdls - ค้นหา Spotlight และเมทาดาทา

    • mdfind <query> ทำ การค้นหาคีย์เวิร์ดด้วย Spotlight ตามคิวรีที่กำหนด
    • mdfind kMDItemAppStoreHasReceipt=1 ค้นหาแอปทั้งหมดที่ติดตั้งจาก Mac App Store
    • mdfind -name <name> ค้นหาไฟล์ทั้งหมดที่ตรงกับชื่อที่กำหนด
    • สามารถจำกัดขอบเขตการค้นหาให้เฉพาะไดเรกทอรีได้ด้วยแฟล็ก -onlyin <dir>
    • mdls <file-path> แสดง Spotlight metadata ทั้งหมดที่เชื่อมโยงกับไฟล์ที่กำหนด

เครือข่าย, การอัปเดต, ข้อมูลระบบ

  • networkQuality - วัดความเร็วอินเทอร์เน็ต

    • networkQuality รัน การทดสอบความเร็วอินเทอร์เน็ต บน Mac
    • หากเพิ่มแฟล็ก -v จะดูข้อมูลแบบละเอียดมากขึ้นได้
    • แฟล็ก -I ใช้รันทดสอบบน network interface ที่กำหนด
  • networksetup - ตรวจสอบและตั้งค่าเครือข่าย

    • networksetup -listnetworkserviceorder แสดงรายการ network service ที่ใช้งานได้
    • networksetup -getinfo <networkservice> แสดงข้อมูลของ network service ที่กำหนด
    • networksetup -getdnsservers <networkservice> แสดง DNS server ของ network service ที่กำหนด
    • networksetup -setairportnetwork <device> <network> [password] เชื่อมต่อกับเครือข่าย Wi‑Fi ที่กำหนด
    • ในกรณีส่วนใหญ่ อาร์กิวเมนต์ <device> คือ "en0"
  • softwareupdate - จัดการการอัปเดต OS

    • softwareupdate --list แสดง การอัปเดตซอฟต์แวร์ ที่พร้อมใช้งาน
    • sudo softwareupdate -ia ติดตั้งการอัปเดตทั้งหมดที่พร้อมใช้งาน
    • softwareupdate --fetch-full-installer --full-installer-version <version> พยายามดาวน์โหลดตัวติดตั้ง macOS แบบเต็มของเวอร์ชันที่กำหนดไปยัง /Applications
  • system_profiler - ดูข้อมูลระบบ

    • system_profiler โดยค่าเริ่มต้นจะแสดงข้อมูลระบบทั้งหมดที่สามารถใช้งานได้ ซึ่งโดยมากมีปริมาณมาก
    • system_profiler <datatype> แสดงเฉพาะข้อมูลของระบบย่อยที่กำหนด
    • system_profiler -listDataTypes แสดงรายการระบบย่อยทั้งหมดที่สามารถดึงข้อมูลได้
    • data type ที่มีประโยชน์มีดังนี้
      • system_profiler SPHardwareDataType: แสดงภาพรวมฮาร์ดแวร์ของ Mac ปัจจุบัน ชื่อรุ่น และหมายเลขซีเรียล
      • system_profiler SPSoftwareDataType: แสดงภาพรวมซอฟต์แวร์ของ Mac ปัจจุบันและหมายเลขเวอร์ชัน macOS แบบละเอียด
      • system_profiler SPPowerDataType: แสดงข้อมูลพลังงานและแบตเตอรี่ รวมถึงปริมาณไฟ AC ปัจจุบันและจำนวนรอบการชาร์จแบตเตอรี่
      • system_profiler SPDeveloperToolsDataType: แสดงเครื่องมือพัฒนา Xcode ที่เปิดใช้งานอยู่ในปัจจุบันและเวอร์ชัน SDK

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

 
dansepo 2023-07-07

คำสั่ง Terminal ขั้นสูงบน MacBook ที่มีประโยชน์ในชีวิตประจำวัน (สำหรับผู้ใช้ทั่วไป)
https://www.youtube.com/watch?v=EhiqpFtmjig

 
xguru 2023-06-28

คำสั่ง CLI ขั้นสูงของ macOS

ผมเคยสรุปบทความเดียวกันนี้แล้วโพสต์ไว้เมื่อ 7 เดือนก่อน แต่สรุปฝั่งนี้น่าอ่านกว่าจริง ๆ.. T_T

 
edunga1 2023-06-28

ย่อประมาณนี้ก็เข้าใจได้ไม่ยากอยู่แล้ว เลยรู้สึกว่าดีกว่าด้วยครับ ฮ่า

 
botplaysdice 2023-06-28

ไม่ใช่อย่างนั้นหรอก......ฮ่าๆ

 
GN⁺ 2023-06-28
ความเห็นจาก Hacker News
  • ถ้าใช้ sips กับ iconutil ร่วมกัน ก็สามารถสร้างไฟล์ .icns สำหรับแอปจาก PNG ขนาด 1024×1024 เพียงไฟล์เดียวได้โดยไม่ต้องพึ่งเครื่องมือจากภายนอก
    สร้าง iconset ด้วย mkdir MyIcon.iconset จากนั้นใช้ sips -z เพื่อสร้างไฟล์ขนาด 16/32/128/256/512 และไฟล์ @2x แล้วรัน iconutil -c icns MyIcon.iconset
    เพิ่มเติมคือสามารถสร้าง .ico ได้ด้วย ffmpeg -i MyIcon.iconset/icon_256x256.png icon.ico
    แต่ก็ยังสงสัยว่า ด้วยวิธีที่ sips ย่อ PNG นั้น การสร้างเวอร์ชัน 16px ตรงจาก 1024px จะดีกว่า หรือค่อย ๆ ย่อลงทีละขั้นจาก 32px จะดีกว่ากัน

    • ถ้าไฟล์ตั้งต้นเป็น SVG ก็สามารถใช้ qlmanage เพื่อสร้าง PNG ขนาด 1024×1024 ก่อนแทน cp ได้
      qlmanage -t -s 1024x1024 -o MyIcon.iconset/Icon1024.png icon.svg
    • ถ้าต้องการไอคอนขนาดเล็กที่ดูดีจริง ๆ โดยเฉพาะ 16×16 หรือ 32×32 หลังย่อแล้วก็ควรเก็บรายละเอียดด้วยมือเพื่อให้ภาพคมชัด
      แต่พอไปดูไอคอนระบบของ macOS แล้ว ดูเหมือนสมัยนี้จะไม่ได้ปรับด้วยมือกันอีกแล้ว
  • ชอบ pbcopy และ pbpaste ในรายการนี้เป็นพิเศษ
    เวลาจัดการ JSON แบบบีบอัด แค่ไปที่ iTerm แล้วรัน pbpaste | json_pp | pbcopy ก็จะได้ผลลัพธ์ที่จัดรูปแบบเรียบร้อยกลับเข้าไปอยู่ในคลิปบอร์ด สะดวกมาก

    • ใช้แพตเทิร์น pbpaste | something | pbcopy บ่อยจนคุ้มจะทำเป็น shell function
      ใช้ได้ประมาณ pbfilter json_pp, pbfilter base64 -d, pbfilter sed 's/this/that/'
      ถ้ารันแค่ pbfilter โดยไม่ใส่อาร์กิวเมนต์ มันก็ทำงานเป็นตัวกรองที่ลบการจัดรูปแบบออกจากคลิปบอร์ดและเหลือไว้เฉพาะ plain text ได้ด้วย
      แต่จะใช้กับ alias, pipeline หรือ expression ที่ซับซ้อนไม่ได้ และคำสั่งฟิลเตอร์ต้องเป็นคำสั่งปกติหรือฟังก์ชันพร้อมอาร์กิวเมนต์เท่านั้น
    • โฟลว์นี้เป็นวิธีแก้ปัญหาข้อความที่ทั้งทรงพลังและเรียบร้อยมาก
      ตัวอย่างเช่น บรรทัดว่างซ้อนที่เกิดจากการคัดลอก/วางแบบ Windows สามารถจัดการได้ด้วย alias winlines="sed '/^$/{$!{N;s/\n//;};}'" และ alias pbw="pbpaste | winlines | pbcopy"
      บน Linux ก็เลียนแบบ macOS ได้คล้าย ๆ กันด้วย alias pbcopy='xsel --clipboard --input', alias pbpaste='xsel --clipboard --output'
    • เรื่องที่น่าหงุดหงิดพอสมควรคือของพวกนี้ใช้ได้แค่กับ plain text และ RTF
      บน X11 มี xclip[0] ส่วนบน Wayland มี wl-clipboard[1] และทั้งคู่รองรับไฟล์ไบนารีผ่านการพาร์ส header หรือการตั้งค่า MIME type แบบชัดเจน
      ทำให้สามารถคัดลอกรูปภาพจากเทอร์มินัลไปวางในโปรแกรม GUI อย่างเบราว์เซอร์หรือแชตไคลเอนต์ได้ หรือจะทำกลับกันก็ได้ และยังมีประโยชน์กับ shell script สำหรับงาน desktop automation ด้วย
      บน macOS จำเป็นต้องอ้อมไปเรียก AppleScript ผ่าน osascript แล้วใช้ set the clipboard to...
      [0] https://github.com/astrand/xclip
      [1] https://github.com/bugaevc/wl-clipboard
    • การใช้ pbcopy/pbpaste ร่วมกับโทรศัพท์ก็ดีมากเหมือนกัน
      ถ้าคัดลอกข้อความบนโทรศัพท์ ก็สามารถดึงมาใช้ในบรรทัดคำสั่งของ Mac ได้ทันทีด้วย pbpaste
    • เวลาจะแก้ไขเนื้อหาในคลิปบอร์ดจะใช้ pbpaste | vipe | pbcopy
      โดย vipe คือยูทิลิตีที่แทรกตัวแก้ไขข้อความ ซึ่งปกติก็คือ vim ไว้กลาง pipe และดูได้ที่ https://joeyh.name/code/moreutils/
  • แม้จะไม่ใช่เครื่องมือบรรทัดคำสั่ง แต่ Network Link Conditioner ก็ดีมากจริง ๆ
    มันสามารถจำลองเครือข่ายที่แย่มากได้ โดยใส่ค่าหน่วงเวลา แบนด์วิดท์ การสูญหายของแพ็กเก็ต ฯลฯ จึงมีประโยชน์มากสำหรับการทดสอบ
    แม้แต่ในการประชุมที่บังคับให้เปิดกล้อง ก็ยังสามารถจงใจทำให้การเชื่อมต่อแย่จนภาพแตกเป็นบล็อกและเสียงเป็นหุ่นยนต์ แล้วพอทุกคนบอกให้ปิดวิดีโอ ก็ทำให้กลับมาปกติได้แบบ “มหัศจรรย์”

    • Comcast ก็ทำแบบเดียวกันได้บน macOS, BSD และ Linux แถมชื่อยังยอดเยี่ยมมาก
    • Toxiproxy เป็นเครื่องมือคล้ายกันที่ใช้ได้ในสภาพแวดล้อมอื่น และช่วยในการทดสอบรวมถึงปรับปรุงโค้ดเครือข่ายภายใต้สภาวะย่ำแย่ เช่น timeout, retry และ packet loss
    • ไม่เคยรู้มาก่อนว่ามีเครื่องมือแบบนี้อยู่ และในแพ็กเกจ “additional tools for X-Code” ก็ยังมีเครื่องมือเจ๋ง ๆ อื่นอีกที่ไม่เคยรู้จัก
      https://developer.apple.com/download/all/
    • บน Linux ก็สามารถทำสิ่งคล้ายกันได้แบบเซียนมาก ๆ ด้วย เครื่องมือ QoS ของเครือข่าย
      https://tldp.org/HOWTO/Traffic-Control-HOWTO/components.html
    • NLC เป็นอินเทอร์เฟซแบบ GUI สำหรับควบคุม dummynet และ PF(packet filter)
      มันตั้งกฎเพื่อหน่วงแพ็กเก็ตหรือทิ้งแพ็กเก็ตตามสัดส่วนที่กำหนดไว้ในโปรไฟล์
      บน macOS ถ้าใช้ dnctl และ pfctl ก็สามารถทำงานคล้ายกันได้ และยังทำได้มากกว่านั้นด้วย
  • ต้องพูดถึง afplay สำหรับเล่นเสียงด้วย
    ใช้มันทำเครื่องเล่น MP3 บนบรรทัดคำสั่งแบบง่าย ๆ ได้
    ยังมียูทิลิตี say สำหรับสังเคราะห์เสียงพูดด้วย ซึ่งรองรับรูปแบบ TUNE ทำให้ปรับเมโลดีกับจังหวะเวลาของการพูดทั้งประโยคได้ และทำให้ฟังดูเหมือนมีอารมณ์ร่วม
    Apple's Speech Synthesis Programming Guide อยู่ที่ https://josh8.com/blog/img/speech-synthesis.pdf และมีบทความที่เกี่ยวข้องสรุปไว้ที่ https://josh8.com/blog/commandline-audio-mac.html

    • น่าเสียดายที่ รูปแบบ TUNE แทบจะเป็นทางตันเชิงวิวัฒนาการ
      เสียงสังเคราะห์รุ่นสุดท้ายที่รองรับมันคือเสียง Alex ที่รวมมาในปี 2007 และดูแล้วแทบไม่มีโอกาสได้เห็นมันกลับมาอีก
      การควบคุมการสังเคราะห์อย่างละเอียดกับความเป็นธรรมชาตินั้นมีความตึงเครียดกันโดยเนื้อแท้ และอย่างหลังมีคุณค่ามากกว่ามาก
    • ขอแก้ไขเล็กน้อย คำสั่งสำหรับดูรายการเสียงคือ say -v '?'
  • ถ้าอยากเพิ่มสมาธิในการทำงานหรือใช้ตอนพรีเซนต์ ก็ซ่อนไอคอนและโฟลเดอร์ทั้งหมดบนเดสก์ท็อปได้
    รัน defaults write com.apple.finder CreateDesktop 0 แล้วตามด้วย killall Finder ก็จะซ่อน และเปลี่ยนค่าเป็น 1 ก็จะแสดงกลับมา
    มี bash alias สำหรับสลับค่านี้ไว้แล้ว และ gist อยู่ที่ https://gist.github.com/berndverst/6f58c0d6aedddb6c06c23e57d...

    • หนึ่งในสิ่งแรก ๆ ที่ทำตอนตั้งค่า Mac เครื่องใหม่คือ ปิดเดสก์ท็อป
      ถึงอย่างนั้นก็ยังใช้ ~/Desktop บ่อยมาก จนเป็นหนึ่งในสองโฟลเดอร์ที่ปักไว้ใน Dock อีกอันคือ ~/Downloads
      อีกด้านหนึ่ง การที่ macOS ใส่ Stacks มาให้บนเดสก์ท็อปนั้นยอดเยี่ยมมาก และเป็นฟีเจอร์ที่ชอบแนะนำให้คนที่ปล่อยเดสก์ท็อปรกไปด้วยไฟล์ใช้เสมอ
    • ใช้วิธีนี้มานานกว่าสิบปีแล้ว และตอนเป็นครูก็เคยผูกไว้กับคีย์ลัดด้วย
      เอาไปรวมกับการตั้งค่าอื่น ๆ ที่น่าจะต้องใช้ในสถานการณ์พรีเซนต์ก็ดีมาก
  • เป็นลิสต์ที่ดี และยังมี hidutil ด้วย
    https://developer.apple.com/library/archive/technotes/tn2450...
    ตัวอย่างเช่น บนคีย์บอร์ด PC สามารถเอาปุ่ม Ins ที่แทบไม่มีประโยชน์อะไรบน macOS ไปเปลี่ยนเป็นคีย์อย่าง PC Execute แล้วให้ Keyboard Maestro จับไป remap ต่อได้

    • ใช้ hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000035}]}' เพื่อเปลี่ยนปุ่ม paragraph มุมซ้ายบนของคีย์บอร์ดแบบยุโรปให้เป็น backtick ที่ใช้งานได้มากกว่า
    • มีตัวสร้างที่ใช้ทำ mapping แบบนี้ได้ค่อนข้างดี
      https://hidutil-generator.netlify.app/
    • อย่าสับสนระหว่าง hidutil กับ hdiutil
      เช่น ใช้ hdiutil detach /Volumes/some-usb-drive เพื่อถอดไดรฟ์ USB หรือใช้ hdiutil makehybrid -joliet -o foo.iso ./srcfolder/ เพื่อสร้าง ISO ได้
  • เมื่อหลายปีก่อน ตอนทำสคริปต์ไว้ค้นหาอะไรบางอย่างในก้อนข้อมูลขนาดใหญ่และให้แจ้งเมื่อเสร็จ ผมเคยใส่คำสั่ง say ไว้ท้ายสคริปต์
    แล้วดันลืมเรื่องนั้นไปและเผลอหลับ พออีกไม่กี่ชั่วโมงต่อมาก็สะดุ้งตื่นเพราะได้ยินเสียงจากห้องทำงานที่บ้าน ฟังเหมือน “ผู้บุกรุก” กำลังพูดกับผู้สมรู้ร่วมคิด ก่อนจะโล่งอกมากเมื่อรู้ว่าเกิดอะไรขึ้น

    • ผมใช้ Pushover สำหรับการแจ้งเตือนบางอย่าง เลยเคยเขียน bash script เล็ก ๆ ชื่อ push ที่รับหัวข้อและเนื้อหาเสริมแบบเลือกใส่ได้
      ใช้งานสะดวกมากในแบบ ./longRunningCommand && push "Task Done" "Here is a body" และยังใช้คู่กับสคริปต์ beep ที่มีไว้ส่งเสียงแจ้งเมื่อทำงานเสร็จตอนที่ผมนั่งอยู่หน้าคอมด้วย
    • สำหรับงานแบบนี้ ผมชอบใช้เสียงตัวอย่าง research complete จาก StarCraft
    • ในทำนองเดียวกัน ยังมีโมดูล Metasploit ที่ทำให้ Mac รันคำสั่ง say ได้หลังจากเจาะเข้าเครื่องแล้ว
      ไม่เคยเห็นใครใช้จริง แต่ก็แอบหวังว่าสักวันจะได้เห็น Twitter thread ที่เปิดมาด้วยประโยคว่า “ผมใช้โมดูล msf ที่เรียก say บนโน้ตบุ๊กของลูกค้า”
    • ถ้าเปิดแท็บเทอร์มินัลค้างไว้หลายแท็บ ก็ง่ายมากที่จะสั่งคำสั่งที่ใช้เวลานานไว้แล้วสลับไปอีกแท็บก่อนจะลืมมันไป
      ผมเลยเพิ่มสคริปต์แจ้งเมื่อคำสั่ง fish ทำงานเสร็จ โดยให้ afplay ส่งเสียงบี๊บถ้างานนั้นใช้เวลา เกิน 5 วินาที
      มันช่วยดึงสมาธิกลับมาได้ดีกับงานที่ “นานพอจะลืมได้พอดี”
    • ถ้าสามารถเปลี่ยนเสียงให้เป็นเสียง Arnold ได้ ผมยอมจ่ายแพงพอสมควรเลย
  • ยูทิลิตีบรรทัดคำสั่ง diskutil ของ macOS ก็ควรได้รับคำชมเหมือนกัน
    วันนี้ผมมีปัญหากับบาง slice ของดิสก์ ซึ่ง Disk Utility แบบกราฟิกของ macOS แก้ไม่ได้ และมันเป็นเศษตกค้างจากตอนเคยลองเล่น Asahi Linux ไว้ก่อนหน้านี้
    ผมคิดว่าน่าจะมีวิธีแก้ด้วย diskutil CLI และก็ไปเจอคำตอบในเธรดนี้
    https://apple.stackexchange.com/questions/411544/cant-reclai...
    ตอนนี้ก็เอาพื้นที่ทั้งดิสก์กลับมาใช้กับ macOS ได้อีกครั้งแล้ว

    • diskutil ยอดเยี่ยมมาก แต่สภาพของ Disk Utility.app นี่น่าเศร้าจริง ๆ
      หลังการเปลี่ยนไปใช้ APFS มันเหมือนไม่ได้รับการดูแลที่ดีพอ และมีกรณีที่ diskutil ทำได้ แต่แอป GUI กลับล้มเหลวโดยสิ้นเชิง
      ก่อนจะถูกออกแบบหน้าตาใหม่ มันเป็นเครื่องมือที่แข็งแรงและอย่างน้อยก็บอกเหตุผลได้เมื่อทำงานไม่สำเร็จ แต่ตอนนี้มันกลายเป็นอินเทอร์เฟซแบบ LEGO Duplo สำหรับเด็ก ที่พอทำได้แค่ฟอร์แมตแฟลชไดรฟ์เท่านั้น
  • ถ้าจำคำสั่งหรือพารามิเตอร์ไม่ได้ um ก็น่าลองใช้เช่นกัน
    https://github.com/promptops/cli
    ตัวอย่างเช่น ถ้าพิมพ์ um prevent my mac from sleeping for 30m ก็จะได้ผลลัพธ์ประมาณ caffeinate -u -t 1800

  • open เป็นคำสั่งที่เรียบง่ายและดี ซึ่งใช้อยู่ตลอด
    ตั้งไว้เป็น alias tab='open . -a iterm', alias phpstorm='open -a "PhpStorm"', alias smerge='open -a "Sublime Merge"' แล้วใช้งานบ่อยกว่ากล่องโต้ตอบ Open/Recents ของแต่ละแอปเสียอีก

    • การเติมคำสั่งอัตโนมัติด้วย Tab ของ open -a ... ให้ความรู้สึกแย่มาหลายปีแล้ว เพราะ Apple ไม่อัปเดต definition สำหรับการเติมคำสั่ง
      มีเขียนวิธีเลี่ยงไว้ในคำตอบนี้บน Stack Overflow: https://stackoverflow.com/a/63097652
    • ในบรรดาแฟลกที่ยังไม่ได้พูดถึง มี -n อยู่ด้วย
      มันช่วยให้รันแอปพลิเคชันเดียวกันได้ หลายอินสแตนซ์ ซึ่งเมื่อก่อนเป็นยูทิลิตีที่ใช้บ่อยที่สุดอย่างหนึ่งสำหรับผม
      ทุกวันนี้ใช้ไม่บ่อยแล้ว เพราะแอปที่มีปัญหาด้านการออกแบบร้ายแรงระดับนั้นมีน้อยลง
    • Sublime Text และ Sublime Merge มี CLI utility มาให้เป็นค่าเริ่มต้นอยู่แล้ว และยังมีความสามารถเพิ่มเติมด้วย
      ใช้ /Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge และ /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl ได้
    • ผมทำสคริปต์ไว้สำหรับเปิดไฟล์ด้วย rofi
      https://github.com/davatorium/rofi
      หน้าตาเป็นแบบนี้: https://i.imgur.com/Hm9TGeV.jpg
      ในเทอร์มินัลของ VS Code ถ้าใช้ alias o ก็จะเปิดจากตำแหน่งปัจจุบัน และจากตรงนั้นสามารถค้นหาไฟล์แล้วเปิดใน editor ได้
    • ถ้าต้องการเปิดหน้าต่าง Finder ใหม่จากไดเรกทอรีปัจจุบันของเทอร์มินัล ให้ใช้ alias finder='open .'