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
? มีวิธีอื่นอีกกี่วิธีในการเปลี่ยนไดเรกทอรี