เมื่อคุณใช้บรรทัดคำสั่ง Linux บ่อยครั้ง การใช้ประวัติคำสั่ง (history) อย่างมีประสิทธิภาพจะช่วยเพิ่มประสิทธิภาพการทำงานได้มาก ยิ่งไปกว่านั้น เมื่อคุณเชี่ยวชาญ 15 ตัวอย่างที่นำเสนอที่นี่แล้ว คุณจะพบว่าการใช้บรรทัดคำสั่งเป็นประสบการณ์ที่น่าสนุกและเพลิดเพลินมากขึ้น
1. แสดงป้ายเวลาด้วย HISTTIMEFORMAT
โดยปกติเมื่อพิมพ์ history จากบรรทัดคำสั่ง จะแสดงหมายเลขคำสั่งและคำสั่งเท่านั้น สำหรับการตรวจสอบ (auditing) อาจจะมีประโยชน์หากแสดงป้ายเวลาพร้อมกับคำสั่ง ตามที่แสดงด้านล่าง
# export HISTTIMEFORMAT='%F %T ' # history | more 1 2008-08-05 19:02:39 service network restart 2 2008-08-05 19:02:39 exit 3 2008-08-05 19:02:39 id 4 2008-08-05 19:02:39 cat /etc/redhat-release
2. ค้นหาประวัติด้วย Control+R
ผมเชื่ออย่างยิ่งว่านี่อาจเป็นฟีเจอร์ของ history ที่คุณใช้บ่อยที่สุด เมื่อคุณได้รันคำสั่งที่ยาวมากไปแล้ว คุณสามารถค้นหาประวัติด้วยคำสำคัญและรันคำสั่งเดิมซ้ำได้โดยไม่ต้องพิมพ์ทั้งหมด กด Control+R และพิมพ์คำสำคัญ ในตัวอย่างต่อไปนี้ ผมค้นหา red ซึ่งแสดงคำสั่งก่อนหน้า "cat /etc/redhat-release" ในประวัติที่มีคำว่า red
# [กด Ctrl+R จากพรอมต์คำสั่ง จะแสดงพรอมต์ reverse-i-search] (reverse-i-search)`red': cat /etc/redhat-release [หมายเหตุ: กด Enter เมื่อเห็นคำสั่งของคุณ จะรันคำสั่งจากประวัติ] # cat /etc/redhat-release Fedora release 9 (Sulphur)
บางครั้งคุณอาจต้องการแก้ไขคำสั่งจากประวัติ ก่อนรัน เช่น คุณค้นหา httpd จะแสดง service httpd stop จากประวัติ เลือกคำสั่งนี้และ เปลี่ยน stop เป็น start แล้วรันซ้ำ ตามด้านล่าง
# [กด Ctrl+R จากพรอมต์คำสั่ง จะแสดงพรอมต์ reverse-i-search] (reverse-i-search)`httpd': service httpd stop [หมายเหตุ: กด ลูกศรซ้ายหรือขวา เมื่อเห็นคำสั่ง จะแสดงคำสั่งให้แก้ไข ก่อนรัน] # service httpd start
3. รันคำสั่งก่อนหน้าซ้ำอย่างรวดเร็ว 4 วิธี
บางครั้งคุณอาจต้องรันคำสั่งก่อนหน้าซ้ำหลายครั้ง ดังนี้ 4 วิธีที่แตกต่างกันในการรันคำสั่งล่าสุดซ้ำ
- ใช้ ลูกศรขึ้น เพื่อดูคำสั่งก่อนหน้าและกด Enter เพื่อรัน
- พิมพ์ !! และกด Enter จากบรรทัดคำสั่ง
- พิมพ์ !-1 และกด Enter จากบรรทัดคำสั่ง
- กด Control+P จะแสดงคำสั่งก่อนหน้า กด Enter เพื่อรัน
4. รันคำสั่งเฉพาะจากประวัติ
ในตัวอย่างต่อไปนี้ หากต้องการรันคำสั่ง #4 ซ้ำ สามารถทำ !4 ได้ตามด้านล่าง
# history | more 1 service network restart 2 exit 3 id 4 cat /etc/redhat-release # !4 cat /etc/redhat-release Fedora release 9 (Sulphur)
5. รันคำสั่งก่อนหน้าที่เริ่มต้นด้วยคำเฉพาะ
พิมพ์ ! ตามด้วยตัวอักษรแรกๆ ของคำสั่งที่ต้องการรันซ้ำ ในตัวอย่าง การพิมพ์ !ps และ Enter รันคำสั่งก่อนหน้าที่เริ่มด้วย ps ซึ่งคือ 'ps aux | grep yp'
# !ps ps aux | grep yp root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
6. ควบคุมจำนวนบรรทัดทั้งหมดในประวัติด้วย HISTSIZE
เพิ่มสองบรรทัดต่อไปนี้ลงใน .bash_profile และล็อกอินเข้าสู่ bash shell ใหม่ เพื่อดูการเปลี่ยนแปลง ในตัวอย่างนี้ จะเก็บคำสั่งได้เพียง 450 คำสั่งในประวัติ bash
# vi ~/.bash_profile HISTSIZE=450 HISTFILESIZE=450
7. เปลี่ยนชื่อไฟล์ประวัติด้วย HISTFILE
โดยค่าเริ่มต้น ประวัติจะถูกเก็บในไฟล์ ~/.bash_history เพิ่มบรรทัดต่อไปนี้ลงใน .bash_profile และล็อกอินเข้าสู่ bash shell ใหม่ เพื่อเก็บคำสั่งประวัติในไฟล์ .commandline_warrior แทน .bash_history ผมยังหาเหตุผลที่ปฏิบัติจริงสำหรับการใช้งานนี้ไม่ได้ อาจใช้เมื่อต้องการติดตามคำสั่งที่รันจากเทอร์มินัลต่างๆ โดยใช้ชื่อไฟล์ประวัติที่ต่างกัน
# vi ~/.bash_profile HISTFILE=/root/.commandline_warrior
หากคุณมีเหตุผลที่ดีในการเปลี่ยนชื่อไฟล์ประวัติ โปรดแชร์กับผม ผมสนใจที่จะรู้ว่าคุณใช้ฟีเจอร์นี้อย่างไร
8. กำจัดรายการซ้ำติดต่อกันจากประวัติด้วย HISTCONTROL
ในตัวอย่างต่อไปนี้ พิมพ์ pwd สามครั้ง เมื่อทำ history จะเห็น pwd ทั้ง 3 ครั้งติดต่อกัน เพื่อกำจัดซ้ำ ให้ตั้งค่า HISTCONTROL เป็น ignoredups ตามด้านล่าง
# pwd # pwd # pwd # history | tail -4 44 pwd 45 pwd 46 pwd [หมายเหตุ: มี pwd สามคำสั่ง ในประวัติ หลังจากรัน pwd 3 ครั้ง] 47 history | tail -4 # export HISTCONTROL=ignoredups # pwd # pwd # pwd # history | tail -3 56 export HISTCONTROL=ignoredups 57 pwd [หมายเหตุ: มีเพียง pwd หนึ่งคำสั่ง ในประวัติ แม้รัน pwd 3 ครั้ง] 58 history | tail -4
9. ลบซ้ำทั่วทั้งประวัติด้วย HISTCONTROL
ignoredups ข้างต้นลบซ้ำได้เฉพาะคำสั่งที่ติดต่อกัน เพื่อลบซ้ำทั่วทั้งประวัติ ให้ตั้งค่า HISTCONTROL เป็น erasedups ตามด้านล่าง
# export HISTCONTROL=erasedups # pwd # service httpd stop # history | tail -3 38 pwd 39 service httpd stop 40 history | tail -3 # ls -ltr # service httpd stop # history | tail -6 35 export HISTCONTROL=erasedups 36 pwd 37 history | tail -3 38 ls -ltr 39 service httpd stop [หมายเหตุ: service httpd stop ก่อนหน้าหลัง pwd ถูกลบออก] 40 history | tail -6
10. บังคับไม่ให้ประวัติจดจำคำสั่งเฉพาะด้วย HISTCONTROL
เมื่อรันคำสั่ง คุณาสั่งให้ประวัติข้ามคำสั่งนั้นได้ โดยตั้งค่า HISTCONTROL เป็น ignorespace และพิมพ์ช่องว่างหน้าคำสั่ง ตามด้านล่าง ผมเห็น sysadmin รุ่นใหม่หลายคนตื่นเต้นกับเรื่องนี้ เพราะสามารถซ่อนคำสั่งจากประวัติได้ ทำความเข้าใจ ignorespace ให้ดี แต่วิธีปฏิบัติที่ดี ไม่ควรซ่อนอะไรจากประวัติโดยเจตนา
# export HISTCONTROL=ignorespace # ls -ltr # pwd # service httpd stop [หมายเหตุ: มีช่องว่างหน้า service เพื่อข้ามคำสั่งนี้จากประวัติ] # history | tail -3 67 ls -ltr 68 pwd 69 history | tail -3
11. ล้างประวัติทั้งหมดด้วยตัวเลือก -c
บางครั้งอาจต้องการล้างประวัติทั้งหมด แต่ต้องการให้ประวัติทำงานต่อไปได้
# history -c
12. แทนที่คำจากคำสั่งในประวัติ
เมื่อค้นหาผ่านประวัติ คุณอาจต้องการรันคำสั่งที่ต่างออกไป แต่ใช้พารามิเตอร์เดียวกับคำสั่งที่เพิ่งค้นหา
ในตัวอย่างด้านล่าง !!:$ ถัดจากคำสั่ง vi จะดึงอาร์กิวเมนต์จากคำสั่งก่อนหน้ามาใช้ในคำสั่งปัจจุบัน
# ls anaconda-ks.cfg anaconda-ks.cfg # vi !!:$ vi anaconda-ks.cfg
ในตัวอย่างด้านล่าง !^ ถัดจากคำสั่ง vi จะดึงอาร์กิวเมนต์แรกจากคำสั่งก่อนหน้า (คือ cp) มาใช้ในคำสั่งปัจจุบัน (คือ vi)
# cp anaconda-ks.cfg anaconda-ks.cfg.bak anaconda-ks.cfg # vi !^ vi anaconda-ks.cfg
13. แทนที่อาร์กิวเมนต์เฉพาะสำหรับคำสั่งเฉพาะ
ในตัวอย่างด้านล่าง !cp:2 ค้นหาคำสั่งก่อนหน้าในประวัติที่เริ่มด้วย cp และนำอาร์กิวเมนต์ที่สองของ cp มาแทนในคำสั่ง ls -l ตามด้านล่าง
# cp ~/longname.txt /really/a/very/long/path/long-filename.txt # ls -l !cp:2 ls -l /really/a/very/long/path/long-filename.txt
ในตัวอย่างด้านล่าง !cp:$ ค้นหาคำสั่งก่อนหน้าที่เริ่มด้วย cp และนำอาร์กิวเมนต์สุดท้าย (ในกรณีนี้คืออาร์กิวเมนต์ที่สองเหมือนกัน) ของ cp มาแทนใน ls -l
# ls -l !cp:$ ls -l /really/a/very/long/path/long-filename.txt
14. ปิดการใช้งานประวัติด้วย HISTSIZE
หากต้องการปิดประวัติทั้งหมดและไม่ให้ bash shell จดจำคำสั่งที่พิมพ์ ให้ตั้งค่า HISTSIZE เป็น 0 ตามด้านล่าง
# export HISTSIZE=0 # history # [หมายเหตุ: history ไม่แสดงอะไรเลย]
15. เพิกเฉยคำสั่งเฉพาะจากประวัติด้วย HISTIGNORE
บางครั้งอาจไม่อยากให้ประวัติสับสนด้วยคำสั่งพื้นฐานอย่าง pwd และ ls ใช้ HISTIGNORE ระบุคำสั่งทั้งหมดที่ต้องการเพิกเฉยจากประวัติ โปรดทราบว่าการเพิ่ม ls ใน HISTIGNORE เพิกเฉยได้แค่ ls ไม่ใช่ ls -l ดังนั้น ต้องระบุคำสั่งที่แน่นอนที่ต้องการเพิกเฉย
# export HISTIGNORE="pwd:ls:ls -ltr:" # pwd # ls # ls -ltr # service httpd stop # history | tail -3 79 export HISTIGNORE="pwd:ls:ls -ltr:" 80 service httpd stop 81 history [หมายเหตุ: ประวัติไม่ได้บันทึก pwd, ls และ ls -ltr]
หนังสือแนะนำ
Bash 101 Hacks, by Ramesh Natarajan ผมใช้เวลาส่วนใหญ่ในสภาพแวดล้อม Linux ดังนั้นจึงเป็นแฟนใหญ่ของบรรทัดคำสั่ง Bash และการเขียนสคริปต์เชลล์ 15 ปีก่อน เมื่อทำงานบน *nix หลายรส ผมเขียนโค้ดบน C shell และ Korn shell มาก ต่อมาเมื่อเริ่มทำงานบน Linux เป็นผู้ดูแลระบบ ผมทำให้งานทุกอย่างเป็นอัตโนมัติด้วย Bash shell scripting จากประสบการณ์ Bash ผมเขียน eBook Bash 101 Hacks ที่มี 101 ตัวอย่างปฏิบัติจริงทั้งบรรทัดคำสั่งและสคริปต์เชลล์ หากคิดว่าจะเชี่ยวชาญ Bash ให้ทำความดีใจตัวเองและอ่านหนังสือเล่มนี้ จะช่วยควบคุมบรรทัดคำสั่ง Bash และการเขียนสคริปต์เชลล์ได้
บทความ Linux ที่น่าสนใจ
ต่อไปนี้คือบทความ 15 ตัวอย่าง ที่น่าสนใจซึ่งคุณอาจพบว่ามีประโยชน์
- Unix LS Command: 15 Practical Examples
- Get a Grip on the Grep! – 15 Practical Grep Command Examples
- Linux Crontab: 15 Awesome Cron Job Examples
- Mommy, I found it! — 15 Practical Linux Find Command Examples