สัญญาณที่สร้างสรรค์และเกี่ยวข้องกับคุณพูด? ตกลง:
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
ในนั้นจะไม่สนใจสัญญาณในพวกเขา (ซึ่งจะช่วยแก้ปัญหา)
ในที่สุดแม้ว่าสิ่งนี้จะเป็นสิ่งที่คุณร้องขอการสั่งซื้อที่คุณได้รับจะผิดปกติเล็กน้อย โดยเฉพาะอย่างยิ่งบิตของประวัติจะถูกทำซ้ำในการสั่งซื้อที่แตกต่างกันในขณะที่พวกเขากำลังโหลดและบันทึกแยกต่างหาก นั่นคือสิ่งที่คุณขอมา แต่โปรดทราบว่าประวัติลูกศรขึ้นนั้นมีประโยชน์น้อยกว่ามากในตอนนี้ การทดแทนประวัติและสิ่งที่คล้ายกันจะถูกแชร์และทำงานได้ดี