สัญญาณที่สร้างสรรค์และเกี่ยวข้องกับคุณพูด? ตกลง:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
โยนมันเข้า.bashrc
และออก สิ่งนี้ใช้สัญญาณเพื่อบอกทุกbash
ขั้นตอนในการตรวจสอบรายการประวัติใหม่เมื่ออีกรายการหนึ่งออก มันแย่มาก แต่ใช้งานได้จริง
มันทำงานยังไง?
trap
ตั้งค่าตัวจัดการสัญญาณสำหรับสัญญาณระบบหรือเหตุการณ์ภายในของ Bash EXIT
เหตุการณ์ใด ๆ การยกเลิกการควบคุมของเปลือกในขณะที่USR1
เป็นSIGUSR1
สัญญาณความหมายที่เรากำลังจัดสรร
เมื่อใดก็ตามที่เปลือกหอยออกไปเราจะ:
- ผนวกประวัติทั้งหมดเข้ากับไฟล์อย่างชัดเจน
- ปิดการใช้งาน
SIGUSR1
ตัวจัดการและทำให้เชลล์นี้ไม่สนใจสัญญาณ
- ส่งสัญญาณไปยัง
bash
กระบวนการที่กำลังทำงานทั้งหมดจากผู้ใช้เดียวกัน
เมื่อมีคนSIGUSR1
มาถึงเรา:
- โหลดรายการใหม่ทั้งหมดจากไฟล์ประวัติลงในรายการประวัติในหน่วยความจำของเชลล์
เนื่องจากวิธีการทุบตีสัญญาณที่จับคุณจะไม่ได้รับจริงข้อมูลประวัติศาสตร์ใหม่จนกว่าคุณจะตีEnterครั้งต่อไปดังนั้นนี้ไม่ได้ดำเนินการใด ๆ ที่ดีขึ้นในด้านหน้าที่กว่าการวางลงในhistory -n
PROMPT_COMMAND
มันจะบันทึกการอ่านไฟล์อย่างต่อเนื่องเมื่อไม่มีอะไรเกิดขึ้นและไม่มีการเขียนเลยจนกว่าเชลล์จะออก
อย่างไรก็ตามยังมีปัญหาอีกสองสามข้อที่นี่ แรกคือการตอบสนองเริ่มต้นที่SIGUSR1
จะยุติเปลือก bash
กระบวนการอื่นใด(ตัวอย่างเช่นการรันเชลล์สคริปต์) จะถูกฆ่า .bashrc
ไม่ได้ถูกโหลดโดยเชลล์ที่ไม่ใช่แบบโต้ตอบ แต่จะโหลดไฟล์ที่ชื่อโดยBASH_ENV
: คุณสามารถตั้งค่าตัวแปรนั้นในสภาพแวดล้อมของคุณทั่วโลกให้ชี้ไปที่ไฟล์ด้วย:
trap '' USR1
ในนั้นจะไม่สนใจสัญญาณในพวกเขา (ซึ่งจะช่วยแก้ปัญหา)
ในที่สุดแม้ว่าสิ่งนี้จะเป็นสิ่งที่คุณร้องขอการสั่งซื้อที่คุณได้รับจะผิดปกติเล็กน้อย โดยเฉพาะอย่างยิ่งบิตของประวัติจะถูกทำซ้ำในการสั่งซื้อที่แตกต่างกันในขณะที่พวกเขากำลังโหลดและบันทึกแยกต่างหาก นั่นคือสิ่งที่คุณขอมา แต่โปรดทราบว่าประวัติลูกศรขึ้นนั้นมีประโยชน์น้อยกว่ามากในตอนนี้ การทดแทนประวัติและสิ่งที่คล้ายกันจะถูกแชร์และทำงานได้ดี