Ghi nhớ lịch sử bash địa phương trong một thư mục?


11

Tôi có một tập lệnh trong một thư mục mà tôi sử dụng với các đối số dài. Có bất kỳ cơ hội nào tôi có thể có một lịch sử của các lệnh được thực thi trong thư mục cụ thể đó thay vì quay lại toàn bộ lịch sử không?


3
Câu hỏi thú vị. BTW, không cần quay lại "trong toàn bộ lịch sử", bạn có thể sử dụng Ctrl + R để tìm kiếm nó, đó là những gì tôi sẽ làm trong những tình huống như vậy.
phk

Vâng, nó giúp nhưng theo cách này tôi chỉ có cái cuối cùng. Có khả năng có nhiều hơn một kết quả không?
faber

1
Bạn có thể tiếp tục nhấn Ctrl + R khi bạn đã nhập một phần tên lệnh.
mtahmed

history | lesscó lẽ? Nó không thực sự trả lời câu hỏi của bạn nhưng đó là nơi tôi bắt đầu.
roaima

@roaima Và sau đó tìm kiếm bằng cách sử dụng "/" + cụm từ tìm kiếm + nhập và sau đó "n" / "N" để tiếp tục tìm kiếm tiến / lùi.
phk

Câu trả lời:


2

Bằng cách kết nối với PROMPT_COMMAND của bash, chức năng này sẽ được chạy mỗi khi bạn nhận được lời nhắc mới, vì vậy đây là thời điểm thích hợp để kiểm tra xem bạn có đang ở trong thư mục mà bạn muốn có lịch sử tùy chỉnh không. Hàm này có bốn nhánh chính:

  1. Nếu thư mục hiện tại ( $PWD) không thay đổi, thì không làm gì cả (trả về).

Nếu PWD đã thay đổi, thì chúng tôi sẽ thiết lập một hàm cục bộ với mục đích duy nhất là đưa mã "thư mục tùy chỉnh" vào một nơi. Bạn sẽ muốn thay thế các thư mục kiểm tra của tôi bằng các thư mục của riêng bạn (cách nhau |).

  1. Nếu chúng ta không thay đổi thành hoặc thoát khỏi một thư mục tùy chỉnh, thì chỉ cần cập nhật biến "thư mục trước" và trả về hàm.

Vì chúng tôi đã thay đổi thư mục, cập nhật biến "thư mục trước", sau đó lưu lịch sử trong bộ nhớ ra HISTFILE, sau đó xóa lịch sử trong bộ nhớ.

  1. Nếu chúng tôi đã thay đổi thành một thư mục tùy chỉnh, thì hãy đặt HISTFILE thành một .bash_historytệp trong thư mục hiện tại.

  2. Nếu không, chúng tôi đã thay đổi ra khỏi một thư mục tùy chỉnh, vì vậy reset HISTFILE đến một trong những cổ phiếu.

Cuối cùng, vì chúng tôi đã thay đổi các tệp lịch sử, hãy đọc lại lịch sử trước đó.

Để thực hiện mọi thứ, tập lệnh sẽ đặt giá trị PROMPT_COMMAND và lưu hai biến sử dụng nội bộ (HISTFILE stock và "thư mục trước").

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

Câu trả lời của Jeff là tuyệt vời nếu bạn muốn lịch sử cho một thư mục, nhưng nếu bạn đồng ý cài đặt zsh, bạn có thể sử dụng thư mục per-history để lấy lịch sử cụ thể cho thư mục cho tất cả các thư mục.

Bạn có thể cài đặt zsh bằng cách:

brew install zsh

Ngoài ra, nếu bạn muốn cài đặt oh-my-zsh , bạn có thể thêm plugin histdb và viết một truy vấn tùy chỉnh để truy vấn db sqlite mà histdb thêm vào. Tôi đã viết về điều đó và thêm hoàn thành tự động trong bài đăng Dev Diaries . Kiểm tra phần lệnh thưởng .

Các truy vấn trông như thế này

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"
}

Điều này cũng chấp nhận một giới hạn tùy chọn:

show_local_history 50

ví dụ.


-1

Khi tôi cần sử dụng một lệnh với các đối số dài nhiều lần, tôi thường tạo một bí danh trong tôi ~/.bash_aliaseshoặc bạn có thể đặt nó trong lệnh của bạn ~/.bashrcnếu bạn thích. Thật dễ dàng và tiết kiệm thời gian thay vì tìm kiếm các lệnh cũ trong lịch sử.


1
Đó là một gợi ý tốt nhưng không phải là những gì OP đang tìm kiếm. OP khá cụ thể cho những gì anh ấy / cô ấy đang tìm kiếm (một giải pháp tôi cũng sẽ đăng ký BTW).
phk

@phk Bạn nói đúng, lần sau tôi sẽ cẩn thận hơn! Cảm ơn lời giải thích của bạn!
andurrh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.