ข้อกำหนดเบื้องต้น:
ในการดำเนินการตามขั้นตอนที่แสดงในบทช่วยสอนนี้ คุณต้องมีส่วนประกอบต่อไปนี้:
- ระบบ 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:ปี
ความคงอยู่ของประวัติศาสตร์
เมื่อทำงานกับ 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
มีความสุขในการคำนวณ!