ประวัติทุบตีคำสั่งและการขยาย

Prawati Thubti Kha Sang Laea Kar Khyay



ในคู่มือนี้ เราจะสาธิตวิธีการทำงานกับคำสั่ง Bash history

ข้อกำหนดเบื้องต้น:

ในการดำเนินการตามขั้นตอนที่แสดงในบทช่วยสอนนี้ คุณต้องมีส่วนประกอบต่อไปนี้:

  • ระบบ Linux ที่ได้รับการกำหนดค่าอย่างถูกต้อง เช็คเอาท์ วิธีตั้งค่า Ubuntu VM ใน VirtualBox .
  • ความคุ้นเคยพื้นฐานกับอินเตอร์เฟสบรรทัดคำสั่ง

ประวัติทุบตี

Bash เป็นเชลล์เริ่มต้นในระบบ Linux สมัยใหม่ส่วนใหญ่ ในฐานะผู้สืบทอดของ “sh” ซึ่งเป็นเชลล์ UNIX ดั้งเดิม มันมาพร้อมกับคุณสมบัติและการปรับปรุงมากมาย เช่น การจัดการไดเร็กทอรี การควบคุมงาน นามแฝง ประวัติคำสั่ง และอื่นๆ







Bash ติดตามคำสั่งทั้งหมดที่ถูกดำเนินการก่อนหน้านี้จากเทอร์มินัล สิ่งนี้มีประโยชน์อย่างเหลือเชื่อในหลาย ๆ สถานการณ์ เช่น การดีบัก นอกจากนี้ยังสามารถลดความจำเป็นในการพิมพ์คำสั่งที่เหมือนกัน/คล้ายคลึงกันซ้ำแล้วซ้ำอีก



สำหรับการจัดการประวัติ Bash มาพร้อมกับสองคำสั่งในตัว:



$ พิมพ์ ประวัติศาสตร์





$ พิมพ์ เอฟซี

ในการจัดเก็บประวัติ Bash ใช้สองเทคนิคที่แตกต่างกัน:



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

ไฟล์ประวัติเริ่มต้นที่ Bash ใช้อยู่ที่:

$ แมว ~ / .bash_history

นอกจากนี้ยังมีตัวแปรสภาพแวดล้อมและแป้นพิมพ์ลัดจำนวนหนึ่งที่เปลี่ยนวิธีที่ Bash จัดการกับประวัติ

การทำงานกับ Bash History

การใช้งานพื้นฐาน

หากต้องการดูรายการคำสั่งที่เพิ่งเรียกใช้ ให้ใช้คำสั่งต่อไปนี้:

$ ประวัติศาสตร์

ที่นี่ คำสั่งทั้งหมดที่เก็บไว้ในบัฟเฟอร์จะแสดงรายการ แต่ละคำสั่งได้กำหนดค่าตัวเลข คำสั่งที่เก่าที่สุดถูกกำหนดด้วย 1

เราสามารถจำกัดจำนวนคำสั่งในการพิมพ์ได้โดยใช้คำสั่งดังนี้

$ ประวัติศาสตร์ เอ็น

ในที่นี้ N เป็นจำนวนเต็มโดยที่ N >= 0 เอาต์พุตประกอบด้วยคำสั่ง N ล่าสุดจากประวัติ

เรายังสามารถใช้เอาต์พุตควบคู่กับ grep สำหรับการกรอง:

$ ประวัติศาสตร์ | จับ < สตริง >

ในการเรียกดูประวัติอันยาวนาน เราสามารถใช้คำสั่ง “น้อยกว่า”:

$ ประวัติศาสตร์ | น้อย

การลบคำสั่งจากประวัติ

หากคุณต้องการลบคำสั่งเฉพาะออกจากประวัติ ให้ใช้คำสั่งต่อไปนี้:

$ ประวัติศาสตร์

$ ประวัติศาสตร์ -d < command_number >

$ ประวัติศาสตร์

ในทำนองเดียวกัน หากต้องการลบคำสั่งจาก M ถึง N ออกจากประวัติ เราสามารถใช้คำสั่งต่อไปนี้:

$ ประวัติศาสตร์

$ ประวัติศาสตร์ -d เอ็ม-เอ็น

$ ประวัติศาสตร์

หากต้องการล้างประวัติจากบัฟเฟอร์ RAM สำหรับเซสชันเทอร์มินัลปัจจุบัน ให้ใช้คำสั่งต่อไปนี้แทน:

$ ประวัติศาสตร์ -ค

$ ประวัติศาสตร์

หากต้องการล้างประวัติออกจากไฟล์ประวัติที่จัดเก็บไว้ในดิสก์ เราสามารถเขียนทับข้อมูลทั้งหมดด้วย NULL:

$ แมว / ผู้พัฒนา / โมฆะ > $ฮิสไฟล์

การตั้งค่าประวัติทุบตี

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

หากต้องการเปลี่ยนค่า เราแก้ไขไฟล์ 'bashrc':

$ นาโน ~ / .bashrc

หลังจากแก้ไข ให้บันทึกไฟล์และโหลดใหม่ใน Bash

$ แหล่งที่มา ~ / .bashrc

หากต้องการทำการเปลี่ยนแปลงทั้งระบบ ให้แก้ไข 'bashrc' ซึ่งอยู่ที่ตำแหน่งต่อไปนี้:

$ นาโน / เป็นต้น / bash.bashrc

$ นาโน / เป็นต้น / ทุบตี

ขนาดบัฟเฟอร์

ดังที่ได้กล่าวไว้ก่อนหน้านี้ Bash ใช้สองบัฟเฟอร์เพื่อจัดเก็บประวัติคำสั่งใน RAM (สำหรับเซสชันปัจจุบัน) และในไฟล์ดิสก์ (สำหรับเซสชันก่อนหน้าทั้งหมด)

ขนาดของบัฟเฟอร์เหล่านี้ถูกควบคุมโดยตัวแปรสภาพแวดล้อมสองตัว:

  • HISTSIZE : กำหนดจำนวนรายการที่จะเก็บไว้ในบัฟเฟอร์ RAM
  • HISTFILESIZE : กำหนดจำนวนรายการที่จะเก็บไว้ในไฟล์ดิสก์

เราสามารถเปลี่ยนค่าใน 'bashrc' เพื่อให้เหมาะกับความต้องการของเรา:

$ นาโน ~ / .bashrc

ตัวอย่างเช่น หากต้องการจัดเก็บ 5,000 รายการในบัฟเฟอร์ทั้งสอง ให้อัปเดต “bashrc” ด้วยรหัสต่อไปนี้:

$ HISTSIZE = 5,000

$ HISTFILESIZE = 5,000

การยกเว้นคำสั่ง

ตามค่าเริ่มต้น Bash จะจัดเก็บทุกคำสั่งที่เรียกใช้ในบัฟเฟอร์ประวัติ อย่างไรก็ตาม เราสามารถกำหนดค่าให้ Bash ละเว้นคำสั่งบางอย่างได้ ซึ่งจะมีประโยชน์ในสถานการณ์ที่คุณต้องเรียกใช้คำสั่งเดิมหลายๆ ครั้ง ทำให้บัฟเฟอร์เต็มไปด้วยสแปม

  • ฮิสคอนโทรล

เริ่มจากตัวอย่างคำสั่งต่อไปนี้:

$ เสียงสะท้อน 'พระสงฆ์' && ประวัติศาสตร์ 5

$ เสียงสะท้อน 'บอน' && ประวัติศาสตร์ 5

ตามที่แสดงเอาต์พุตของคำสั่ง history เฉพาะคำสั่ง echo แรกเท่านั้นที่ลงทะเบียน แต่ไม่ใช่คำสั่งที่สอง

นี่คือการทำงานของตัวแปรสภาพแวดล้อม HISTIGNORE มันบอก Bash ว่าอย่าบันทึกคำสั่งในบัฟเฟอร์ประวัติตามรูปแบบที่กำหนด มีค่าต่อไปนี้:

  • เพิกเฉย : จะไม่ถูกบันทึกหากคำสั่งตรงกับรายการประวัติก่อนหน้า
  • ละเว้น : มันจะไม่ถูกบันทึกหากคำสั่งเริ่มต้นด้วยช่องว่างที่จุดเริ่มต้น
  • ไม่สนใจทั้งคู่ : มันใช้กฎของทั้งการเพิกเฉยและเพิกเฉย
  • ลบออก : บรรทัดก่อนหน้าทั้งหมดที่ตรงกับคำสั่งปัจจุบันจะถูกลบออกจากประวัติ

ในตัวอย่างแรก เราได้สาธิตการใช้งานของignorespace อย่างไรก็ตาม ไม่ใช่ทุก distros ที่อาจส่ง Bash ด้วยการกำหนดค่านี้ และเช่นเคย เราสามารถเพิ่มลงใน “bashrc”:

$ ฮิสคอนโทรล = ละเว้นทั้งคู่

นอกจากนี้ยังสามารถเปิดใช้งานหลายตัวเลือกโดยใช้คำสั่งต่อไปนี้:

$ ฮิสคอนโทรล =ignoredups:ignorespace

ที่นี่ เพิกเฉยต่อ: เพิกเฉยสเปซ เทียบเท่ากับ เพิกเฉยทั้งสอง

  • ฮิสทีนอร์

ตัวแปรสภาพแวดล้อมนี้สามารถมีตั้งแต่หนึ่งรูปแบบขึ้นไป คำสั่งใดๆ ที่ตรงกับรูปแบบใดๆ ที่อธิบายโดย HISTIGNORE จะไม่ถูกลงทะเบียนกับประวัติบัฟเฟอร์ รูปแบบถูกกำหนดโดยใช้นิพจน์ทั่วไป

โครงสร้างมีดังนี้:

$ ฮิสทีนอร์ = '<รูปแบบ_1>' : '<รูปแบบ_2>' : '<รูปแบบ_3>'

ตัวอย่างเช่น หากต้องการแยกคำสั่ง history และ echo จาก Bash history ให้อัพเดต HISTIGNORE ดังนี้:

$ ฮิสทีนอร์ = 'ประวัติศาสตร์' : 'เสียงสะท้อน *'

เราสามารถใช้ชุดคำสั่งต่อไปนี้เพื่อทดสอบ:

$ -l / เคยเป็น / ลูกกุ้ง &> / ผู้พัฒนา / โมฆะ

$ ประวัติศาสตร์

$ เสียงสะท้อน สวัสดีชาวโลก

$ ประวัติศาสตร์

การประทับเวลา

นอกจากนี้ยังสามารถกำหนดค่า Bash ให้บันทึกเวลาที่รันคำสั่งได้อีกด้วย ซึ่งจะมีประโยชน์ในสถานการณ์ต่างๆ เช่น การดีบัก

หากต้องการเปิดใช้งานการประทับเวลาในประวัติ Bash ให้อัปเดตค่าของ HISTTIMEFORMAT:

$ รูปแบบเวลา HIST = '<รูปแบบ_control_char>'

อักขระควบคุมรูปแบบเวลาที่มีอยู่ทั้งหมดมีอยู่ใน man page ของคำสั่ง date

$ ผู้ชาย วันที่

รายการต่อไปนี้ประกอบด้วยรายการง่ายๆ:

  • %T: เวลา
  • %d: วัน
  • %m: เดือน
  • %y:ปี
$ รูปแบบเวลา HIST = '%T %d:'

ความคงอยู่ของประวัติศาสตร์

เมื่อทำงานกับ CLI ในหลายกรณี คุณจะพบว่าตัวเองกำลังทำงานกับเทอร์มินัลหลายเครื่อง นี่คือจุดที่การจัดการประวัติของ Bash อาจกลายเป็นสาเหตุของความเจ็บปวด

ตามค่าเริ่มต้น ไฟล์ประวัติจะได้รับการอัปเดตเมื่อปิดเซสชัน แม้ว่าจะใช้ได้ดีสำหรับเซสชันเดียว แต่ก็ไม่เพียงพอสำหรับหลายเซสชันพร้อมกัน เราสามารถแก้ปัญหานี้ได้โดยบังคับให้ Bash อัปเดตไฟล์ประวัติทุกครั้งที่เรียกใช้คำสั่ง

ในการดำเนินการดังกล่าว ให้อัปเดตค่าของ PROMPT_COMMAND:

$ PROMPT_COMMAND = 'ประวัติ -a'

ที่นี่ ตัวแปร PROMPT_COMMAND สามารถมีคำสั่งที่ถูกต้อง เนื้อหาของ PROMPT_COMMAND ถูกเรียกใช้ก่อนที่ Bash จะเริ่มรับอินพุตของผู้ใช้ คำสั่ง “history –a” บังคับให้ history ผนวกเนื้อหาเข้ากับไฟล์ประวัติ

การขยายประวัติและการออกแบบ

Bash มาพร้อมกับทางลัดในตัวเพื่อใช้ประโยชน์จากคุณสมบัติประวัติของมัน นี่คือรายชื่อผู้ออกแบบ:

  • !! : รันคำสั่งสุดท้ายจากประวัติ
  • !น : รันคำสั่ง Nth จากประวัติ
  • !-น : รันคำสั่ง Nth ก่อนคำสั่งล่าสุดจากประวัติ
  • !<คำสั่ง> : รันคำสั่ง ล่าสุด

สายคำสั่งต่อไปนี้แสดงให้เห็นถึงการใช้งาน:

$ เสียงสะท้อน 1

$ เสียงสะท้อน 2

$ เสียงสะท้อน 3

$ ประวัติศาสตร์

$ ! เสียงสะท้อน

$ ! - 3

$ ! 1

$ !!

ตัวกำหนดบางตัวยังทำงานกับอาร์กิวเมนต์คำสั่งจากประวัติ:

  • !:* : ใช้อาร์กิวเมนต์ทั้งหมดของคำสั่งล่าสุด
  • !:^ : ใช้อาร์กิวเมนต์แรกของคำสั่งล่าสุด
  • !:น : ใช้อาร์กิวเมนต์ที่ N ของคำสั่งล่าสุด
  • !:M-N : ใช้อาร์กิวเมนต์จาก M ถึง N ของคำสั่งล่าสุด
  • !:$ : ใช้อาร์กิวเมนต์สุดท้ายของคำสั่งล่าสุด

สายคำสั่งต่อไปนี้แสดงให้เห็นถึงการใช้งาน:

$ เสียงสะท้อน 1 2 3 4 5 6 7

$ เสียงสะท้อน ! : *

$ เสียงสะท้อน 1 2 3 4 5 6 7

$ เสียงสะท้อน ! :^

$ เสียงสะท้อน 1 2 3 4 5 6 7

$ เสียงสะท้อน ! : 5

$ เสียงสะท้อน 1 2 3 4 5 6 7

$ เสียงสะท้อน ! : 1 - 5

$ เสียงสะท้อน 1 2 3 4 5 6 7

$ เสียงสะท้อน ! :$

หากคุณต้องการทำงานกับพารามิเตอร์ของคำสั่งอื่น ตัวกำหนดจะมีลักษณะดังนี้:

  • !<คำสั่ง>^ : ใช้อาร์กิวเมนต์แรกของคำสั่ง
  • !<คำสั่ง>$ : ใช้อาร์กิวเมนต์สุดท้ายของคำสั่ง

ห่วงโซ่คำสั่งต่อไปนี้แสดงให้เห็นถึงการใช้งาน:

$ -lh / เคยเป็น / บันทึก &> / ผู้พัฒนา / โมฆะ

$ สัมผัส 1 .txt 2 .txt 3 .txt 4 .txt 5 .txt

$ เสียงสะท้อน ! สัมผัส ^

$ เสียงสะท้อน ! สัมผัส $

แป้นพิมพ์ลัดประวัติ

นอกจากคำสั่งและตัวแปรสภาพแวดล้อมทั้งหมดแล้ว Bash ยังรองรับแป้นพิมพ์ลัดจำนวนหนึ่งเพื่อการนำทางประวัติที่ง่ายขึ้น:

  • ขึ้น ปุ่มลูกศร: เลื่อนไปข้างหลัง
  • ลง ปุ่มลูกศร: เลื่อนไปข้างหน้า

นอกจากนี้ยังมีแป้นพิมพ์ลัดที่ใช้ได้สำหรับการค้นหาประวัติการโต้ตอบ:

  • Ctrl + R : ค้นหาคำสั่งในประวัติ
  • Ctrl + O : เรียกใช้คำสั่งที่เลือก
  • Ctrl + G : ออกจากการค้นหาแบบโต้ตอบ

บทสรุป

เราได้พูดคุยเกี่ยวกับประวัติ Bash ในรายละเอียด เราได้เรียนรู้วิธีที่ Bash จัดเก็บประวัติคำสั่งและวิธีใช้ประโยชน์จากมันในรูปแบบต่างๆ เราได้สาธิตวิธีการทำงานกับ Bash history โดยใช้ตัวอย่างต่างๆ

สนใจเรียนรู้เพิ่มเติมเกี่ยวกับ Bash หรือไม่? เดอะ หมวดหมู่ย่อยการเขียนโปรแกรม Bash มีคำแนะนำหลายร้อยรายการเกี่ยวกับคุณลักษณะต่างๆ ของ Bash

มีความสุขในการคำนวณ!