ฉันมีสคริปต์ในโฟลเดอร์ที่ฉันใช้กับอาร์กิวเมนต์ที่มีความยาว มีโอกาสใดบ้างที่ฉันสามารถมีประวัติของคำสั่งที่ดำเนินการในไดเรกทอรีนั้นแทนการย้อนกลับไปดูประวัติทั้งหมด?
history | less
บางที? มันไม่ได้ตอบคำถามของคุณ แต่นั่นคือสิ่งที่ฉันจะเริ่มต้น
ฉันมีสคริปต์ในโฟลเดอร์ที่ฉันใช้กับอาร์กิวเมนต์ที่มีความยาว มีโอกาสใดบ้างที่ฉันสามารถมีประวัติของคำสั่งที่ดำเนินการในไดเรกทอรีนั้นแทนการย้อนกลับไปดูประวัติทั้งหมด?
history | less
บางที? มันไม่ได้ตอบคำถามของคุณ แต่นั่นคือสิ่งที่ฉันจะเริ่มต้น
คำตอบ:
โดยการเชื่อมโยงไปยัง PROMPT_COMMAND ของ bash ฟังก์ชันนี้จะทำงานทุกครั้งที่คุณได้รับพรอมต์ใหม่ดังนั้นจึงเป็นเวลาที่เหมาะสมในการตรวจสอบว่าคุณอยู่ในไดเรกทอรีที่คุณต้องการประวัติแบบกำหนดเองหรือไม่ ฟังก์ชั่นมีสี่สาขาหลัก:
$PWD
) ไม่เปลี่ยนแปลงให้ทำอะไรเลย (ส่งคืน)หาก PWD มีการเปลี่ยนแปลงเราจะตั้งค่าฟังก์ชั่นท้องถิ่นซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือการแยกรหัส "ไดเรกทอรีที่กำหนดเอง" ไว้ในที่เดียว คุณจะต้องการแทนที่ไดเรกทอรีทดสอบของฉันด้วยของคุณเอง (คั่นด้วย|
)
เนื่องจากเราได้เปลี่ยนไดเรกทอรีให้อัปเดตตัวแปร "ไดเรกทอรีก่อนหน้า" จากนั้นบันทึกประวัติในหน่วยความจำออกเป็น HISTFILE แล้วล้างประวัติในหน่วยความจำ
หากเราได้เปลี่ยนลงในไดเรกทอรีที่กำหนดเองแล้วตั้ง HISTFILE จะเป็น.bash_history
ไฟล์ในไดเรกทอรีปัจจุบัน
มิฉะนั้นเราจะเปลี่ยนจากไดเรกทอรีที่กำหนดเองดังนั้นให้รีเซ็ต HISTFILE เป็นสต็อก
ท้ายที่สุดเนื่องจากเราได้เปลี่ยนไฟล์ประวัติให้อ่านย้อนหลังในประวัติก่อนหน้านั้น
เพื่อให้ได้สิ่งต่าง ๆ สคริปต์จะกำหนดค่า PROMPT_COMMAND และบันทึกตัวแปรการใช้งานภายในสองตัว (HISTFILE ของหุ้นและ "ไดเรกทอรีก่อนหน้า")
prompt_command() {
# if PWD has not changed, just return
[[ $PWD == $_cust_hist_opwd ]] && return
function iscustom {
# returns 'true' if the passed argument is a custom-history directory
case "$1" in
( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
( * ) return 1;;
esac
}
# PWD changed, but it's not to or from a custom-history directory,
# so update opwd and return
if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
then
_cust_hist_opwd=$PWD
return
fi
# we've changed directories to and/or from a custom-history directory
# save the new PWD
_cust_hist_opwd=$PWD
# save and then clear the old history
history -a
history -c
# if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
if iscustom "$PWD"
then
HISTFILE=$PWD/.bash_history
else
HISTFILE=$_cust_hist_stock_histfile
fi
# pull back in the previous history
history -r
}
PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD
คำตอบของ Jeff นั้นยอดเยี่ยมถ้าคุณต้องการประวัติสำหรับไดเรกทอรีเดียว แต่ถ้าคุณตกลงกับการติดตั้งzshคุณสามารถใช้ต่อไดเรกทอรีประวัติศาสตร์เพื่อรับประวัติเฉพาะไดเรกทอรีสำหรับไดเรกทอรีทั้งหมด
คุณสามารถติดตั้ง zsh โดย:
brew install zsh
อีกวิธีหนึ่งถ้าคุณต้องการติดตั้งoh-my-zshคุณสามารถเพิ่มในปลั๊กอินhistdbและเขียนแบบสอบถามที่กำหนดเองเพื่อสอบถาม sqlite db ที่ histdb เพิ่มฉันเขียนเกี่ยวกับสิ่งนั้นและเพิ่มความสมบูรณ์อัตโนมัติในโพสต์Dev Diaries ตรวจสอบส่วนคำสั่งโบนัส
แบบสอบถามมีลักษณะเช่นนี้
show_local_history() {
limit="${1:-10}"
local query="
select history.start_time, commands.argv
from history left join commands on history.command_id = commands.rowid
left join places on history.place_id = places.rowid
where places.dir LIKE '$(sql_escape $PWD)%'
order by history.start_time desc
limit $limit
"
results=$(_histdb_query "$query")
echo "$results"
}
สิ่งนี้ยอมรับขีด จำกัด ทางเลือกเช่นกัน
show_local_history 50
ตัวอย่างเช่น.
เมื่อฉันต้องการใช้คำสั่งที่มีอาร์กิวเมนต์ยาวหลายครั้งฉันมักจะสร้างนามแฝงในของฉัน~/.bash_aliases
หรือคุณสามารถวางไว้ในของคุณ~/.bashrc
หากคุณต้องการ ง่ายและประหยัดเวลาแทนที่จะมองหาคำสั่งเก่าในประวัติศาสตร์