Bir klasördeki “yerel” bash geçmişini hatırlıyor musunuz?


11

Uzun argümanlar ile kullandığım bir klasörde bir komut dosyası var. Tüm geçmişe geri dönmek yerine belirli bir dizinde çalıştırılan komutların geçmişine sahip olma şansım var mı?


3
İlginç soru. BTW, "tüm tarih boyunca" geri dönmek yerine, aramak için Ctrl + R kullanabilirsiniz, bu gibi durumlarda böyle yapardım.
phk

evet, yardımcı olur ama bu şekilde sadece sonuncusuna sahibim. Birden fazla sonuca sahip olma olasılığı var mı?
faber

1
Komut adının bir kısmını girdikten sonra Ctrl + R tuşlarına basmaya devam edebilirsiniz.
mtahmed

history | lessbelki? Sorunuza gerçekten cevap vermiyor ama başlayacağım yer burası.
roaima

@roaima Ve sonra ileri / geri arama yapmak için "/" + arama terimi + enter ve sonra "n" / "N" tuşlarını kullanarak arama yapın .
phk

Yanıtlar:


2

Bash'ın PROMPT_COMMAND ürününe bağlandığında, bu işlev her yeni istem aldığınızda çalışır, bu nedenle özel geçmiş istediğiniz bir dizinde olup olmadığınızı kontrol etmek için uygun bir zamandır. Fonksiyonun dört ana dalı vardır:

  1. Geçerli dizin ( $PWD) değişmediyse, hiçbir şey yapmayın (dönüş).

PWD Eğer gelmiştir değişti, o zaman tek amacı faktörüne tek bir yerde "özel dizin" kodudur yerel işlev oluşturdunuz. Test dizinlerimi kendi dizininizle (birbirinden ayrılarak |) değiştirmek isteyeceksiniz .

  1. Özel bir dizine girmedik veya özel bir dizini değiştirmediysek, "önceki dizin" değişkenini güncelleyin ve işlevden çıkın.

Dizinleri değiştirdiğimizden, "önceki dizin" değişkenini güncelleyin, ardından bellek içi geçmişini HISTFILE klasörüne kaydedin ve bellek içi geçmişini silin.

  1. Biz değiştirdiyseniz içine özel bir dizine, sonra olmak HISTFILE set .bash_historygeçerli dizinde dosya.

  2. Aksi halde, değiştirdik dışarı böylece stok birine HISTFILE sıfırlamak, özel bir dizine.

Son olarak, geçmiş dosyalarını değiştirdiğimiz için, önceki geçmişi tekrar okuyun.

İşleri devam ettirmek için komut dosyası PROMPT_COMMAND değerini ayarlar ve iki dahili kullanım değişkenini (stok HISTFILE ve "önceki dizin") kaydeder.

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'in cevabı tek bir dizin için geçmişini istiyorsanız harika ama eğer yüklemekte berabersin Tamam zsh kullanabilirdin başına geçmiş dizin tüm dizinler için dizine bir tarih özgü olsun.

Zsh yükleyebilirsiniz:

brew install zsh

Yüklemek istediğiniz Alternatif olarak, oh-my-zsh , içeri ekleyebilirsiniz histdb eklenti ve histdb içinde eklediği sqlite db sorgulamak için özel bir sorgu yazmak. Ben ve bir de ekleyerek oto tamamlama hakkında yazdığı Dev Diaries yazı. Bonus komutları bölümünü kontrol edin .

Sorgu şuna benzer

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

Bu, isteğe bağlı bir limiti de kabul eder:

show_local_history 50

Örneğin.


-1

Uzun argümanlar içeren bir komutu birkaç kez kullanmam gerektiğinde, genellikle içinde bir takma ad oluştururum ~/.bash_aliasesveya isterseniz bunu sizin adınıza koyabilirsiniz ~/.bashrc. Kolaydır ve zamandan tasarruf edin, bunun yerine geçmişteki eski komutları arayın.


1
Bu iyi bir ipucu ama OP'nin aradığı şey değil. OP aradığı şey için oldukça spesifikti (BTW'ye üye olacağım bir çözüm).
phk

@ phk Haklısın, bir dahaki sefere daha dikkatli olacağım! Açıklaman için teşekkürler!
andreatsh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.