ตัวเลือกของคุณที่นี่จะขึ้นอยู่กับเปลือกของคุณ ในzsh
นั้นมีฟังก์ชั่น hook ที่สะดวกเรียกpreexec()
ว่าถูกเรียกใช้ก่อนคำสั่งเชลล์แบบโต้ตอบใด ๆ โดยการสร้างฟังก์ชั่นที่มีชื่อนี้คุณสามารถทำให้สิ่งที่จะดำเนินการ นอกจากนี้คุณยังสามารถติดตามด้วยฟังก์ชันที่เรียกใช้precmd()
ซึ่งจะทำงานก่อนที่จะพร้อมท์ถัดไปซึ่งจะเกิดขึ้นทันทีหลังจากคำสั่งของคุณเสร็จสิ้น
โดยการสร้างฟังก์ชั่นคู่นี้คุณสามารถมีคำสั่งโดยพลการใด ๆ ที่คุณต้องการเรียกใช้ก่อนและหลังคำสั่งใดก็ตามที่ออกพร้อมท์ คุณสามารถใช้สิ่งนี้เพื่อบันทึกการใช้เชลล์สร้างล็อคทดสอบสภาพแวดล้อมหรือในตัวอย่างของคุณคำนวณเวลาหรือทรัพยากรที่ใช้ในขณะที่คำสั่งทำงาน
ในตัวอย่างนี้เราจะสร้างตัวประทับเวลามาตรฐานก่อนที่จะเรียกใช้คำสั่งโดยใช้preexec()
จากนั้นคำนวณเวลาที่ใช้ในการดำเนินการคำสั่งโดยใช้precmd()
และส่งออกคำสั่งก่อนที่จะให้พรอมต์หรือออกจากระบบ ตัวอย่าง:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
หมายเหตุ:สำหรับตัวอย่างนี้มีฟังก์ชั่นบิวด์อินที่ง่ายยิ่งขึ้น สิ่งที่คุณต้องทำคือเปิดการรายงานรันไทม์ใน ZSH และจะทำสิ่งนี้โดยอัตโนมัติ
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
ในการใช้งานจริงpreexec()
ฉันใช้มันดูว่าเชลล์กำลังทำงานอยู่ภายในtmux
หรือไม่screen
และถ้าเป็นเช่นนั้นเพื่อส่งข้อมูลเกี่ยวกับคำสั่งต้นน้ำที่กำลังทำงานอยู่เพื่อแสดงในแท็บชื่อ
น่าเสียดายที่การทุบตีกลไกเล็ก ๆ นี้ไม่มีอยู่จริง นี่คือชายคนหนึ่งพยายามที่จะทำซ้ำ ดูคำตอบของ Gillesสำหรับแฮ็คเล็ก ๆ ที่คล้ายกัน
preexec
แต่คุณไม่ต้องการเรียกใช้ภายในpreexec
(เช่นpreexec() { time $1; }
) เนื่องจากเชลล์ยังคงรันหลังจากpreexec
ส่งคืน ดังนั้นสิ่งที่ดีที่สุดที่เราสามารถทำได้คือสิ่งที่คล้ายกัน