Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญประวัติคำสั่ง Linux: 15 เคล็ดลับและตัวอย่างอันทรงพลัง

เมื่อคุณใช้บรรทัดคำสั่ง 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 วิธีที่แตกต่างกันในการรันคำสั่งล่าสุดซ้ำ

  1. ใช้ ลูกศรขึ้น เพื่อดูคำสั่งก่อนหน้าและกด Enter เพื่อรัน
  2. พิมพ์ !! และกด Enter จากบรรทัดคำสั่ง
  3. พิมพ์ !-1 และกด Enter จากบรรทัดคำสั่ง
  4. กด 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]

หนังสือแนะนำ

เชี่ยวชาญประวัติคำสั่ง Linux: 15 เคล็ดลับและตัวอย่างอันทรงพลัง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