จำประวัติทุบตี "ท้องถิ่น" ในโฟลเดอร์หรือไม่?


11

ฉันมีสคริปต์ในโฟลเดอร์ที่ฉันใช้กับอาร์กิวเมนต์ที่มีความยาว มีโอกาสใดบ้างที่ฉันสามารถมีประวัติของคำสั่งที่ดำเนินการในไดเรกทอรีนั้นแทนการย้อนกลับไปดูประวัติทั้งหมด?


3
คำถามที่น่าสนใจ BTW ไม่ต้องย้อนกลับไป "ตลอดประวัติศาสตร์" คุณอาจใช้ Ctrl + R เพื่อค้นหานั่นคือสิ่งที่ฉันจะทำในสถานการณ์เช่นนี้
phk

ใช่มันช่วย แต่ด้วยวิธีนี้ฉันมีเพียงคนสุดท้าย มีความเป็นไปได้ที่จะมีผลลัพธ์มากกว่าหนึ่งรายการหรือไม่
faber

1
คุณสามารถกด Ctrl + R เมื่อคุณป้อนชื่อคำสั่งบางส่วนแล้ว
mtahmed

history | lessบางที? มันไม่ได้ตอบคำถามของคุณ แต่นั่นคือสิ่งที่ฉันจะเริ่มต้น
roaima

@roaima แล้วค้นหาโดยใช้"/" + คำค้นหา + ใส่แล้ว"n" / "N"เพื่อค้นหาเพิ่มเติมไปข้างหน้า / ถอยหลัง
phk

คำตอบ:


2

โดยการเชื่อมโยงไปยัง PROMPT_COMMAND ของ bash ฟังก์ชันนี้จะทำงานทุกครั้งที่คุณได้รับพรอมต์ใหม่ดังนั้นจึงเป็นเวลาที่เหมาะสมในการตรวจสอบว่าคุณอยู่ในไดเรกทอรีที่คุณต้องการประวัติแบบกำหนดเองหรือไม่ ฟังก์ชั่นมีสี่สาขาหลัก:

  1. หากไดเรกทอรีปัจจุบัน ( $PWD) ไม่เปลี่ยนแปลงให้ทำอะไรเลย (ส่งคืน)

หาก PWD มีการเปลี่ยนแปลงเราจะตั้งค่าฟังก์ชั่นท้องถิ่นซึ่งมีวัตถุประสงค์เพียงอย่างเดียวคือการแยกรหัส "ไดเรกทอรีที่กำหนดเอง" ไว้ในที่เดียว คุณจะต้องการแทนที่ไดเรกทอรีทดสอบของฉันด้วยของคุณเอง (คั่นด้วย|)

  1. หากเราไม่ได้เปลี่ยนเป็นหรือออกจากไดเรกทอรีที่กำหนดเองเพียงแค่อัปเดตตัวแปร "ไดเรกทอรีก่อนหน้า" และกลับออกจากฟังก์ชั่น

เนื่องจากเราได้เปลี่ยนไดเรกทอรีให้อัปเดตตัวแปร "ไดเรกทอรีก่อนหน้า" จากนั้นบันทึกประวัติในหน่วยความจำออกเป็น HISTFILE แล้วล้างประวัติในหน่วยความจำ

  1. หากเราได้เปลี่ยนลงในไดเรกทอรีที่กำหนดเองแล้วตั้ง HISTFILE จะเป็น.bash_historyไฟล์ในไดเรกทอรีปัจจุบัน

  2. มิฉะนั้นเราจะเปลี่ยนจากไดเรกทอรีที่กำหนดเองดังนั้นให้รีเซ็ต 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

0

คำตอบของ 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

ตัวอย่างเช่น.


-1

เมื่อฉันต้องการใช้คำสั่งที่มีอาร์กิวเมนต์ยาวหลายครั้งฉันมักจะสร้างนามแฝงในของฉัน~/.bash_aliasesหรือคุณสามารถวางไว้ในของคุณ~/.bashrcหากคุณต้องการ ง่ายและประหยัดเวลาแทนที่จะมองหาคำสั่งเก่าในประวัติศาสตร์


1
นั่นเป็นคำใบ้ที่ดี แต่ไม่ใช่สิ่งที่ OP กำลังมองหา OP ค่อนข้างเฉพาะสำหรับสิ่งที่เขา / เธอกำลังมองหา (ฉันจะลงทะเบียนด้วยวิธีแก้ปัญหาเช่น BTW)
phk

@phk คุณถูกต้องฉันจะระวังให้ดีขึ้นในครั้งต่อไป! ขอบคุณสำหรับคำอธิบาย!
andreatsh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.