zsh มีฟังก์ชั่น hook ที่ดีรวมถึงchpwdการใช้งานฟังก์ชั่นหลังจากผู้ใช้เปลี่ยนไดเรกทอรี
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
ฉันพยายามเลียนแบบสิ่งนั้นด้วยการทุบตี
ข้อ จำกัด :
- มันต้องใช้งานได้ทั้งกระสุนแบบโต้ตอบและแบบไม่โต้ตอบซึ่งฉันคิดว่าหมายความว่ามันไม่สามารถพึ่งพาอะไรได้
$PROMPT_COMMAND - ไม่สามารถกำหนดใหม่ได้
cdเพราะฉันต้องการให้มันทำงานกับคำสั่งใด ๆ ที่เปลี่ยนไดเรกทอรี (เช่นpushdและpopd) - มันจะต้องทำงานหลังจากคำสั่งของผู้ใช้ดังนั้นจึง
trap "my_function" DEBUGใช้งานไม่ได้เว้นแต่ฉันจะสามารถพูดได้ที่นั่น "ก่อนอื่นให้$BASH_COMMANDเราติดกับดักจากนั้นก็ทำเช่นนี้ ... " ฉันเห็นว่าฉันสามารถหลีกเลี่ยงการทำงานอัตโนมัติ$BASH_COMMANDหากextdebugเปิดใช้งานและฟังก์ชั่นการดักจับคืนค่า 1 แต่ฉันไม่คิดว่าฉันต้องการบังคับextdebugและการกลับมา1ใช้คำสั่งที่ประสบความสำเร็จ
ส่วนสุดท้าย - "เรียกใช้หลังจากคำสั่งของผู้ใช้" - เป็นสิ่งที่ฉันนิ่งงันในขณะนี้ ถ้าฉันสามารถเรียกใช้ฟังก์ชั่นหลังจากแต่ละคำสั่งฉันสามารถให้มันตรวจสอบว่าไดเรกทอรีมีการเปลี่ยนแปลงตั้งแต่ที่เราตรวจสอบล่าสุด เช่น:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
ฉันไปถูกทางหรือมีวิธีที่ดีกว่า ฉันจะรันคำสั่งใน bash หลังจากที่ผู้ใช้เปลี่ยนไดเรกทอรีได้อย่างไร
cdเป็นหลักการ
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )โปรดอย่าเปลี่ยนคำสั่ง Unix ที่เชื่อถือได้
bashสิ่งที่ใช้งานได้ดีในระบบปฏิบัติการทั้งหมดที่ทำงานอยู่
cd,pushdและpopd? มีวิธีอื่นอีกกี่วิธีในการเปลี่ยนไดเรกทอรี