Ingat riwayat bash "lokal" di folder?

11

Saya memiliki skrip di folder yang saya gunakan dengan argumen panjang. Apakah ada kemungkinan saya dapat memiliki riwayat perintah yang dieksekusi di direktori tertentu daripada kembali melalui seluruh sejarah?

hebat
sumber
3
Pertanyaan menarik. BTW, tidak akan kembali "melalui seluruh sejarah" Anda mungkin menggunakan Ctrl + R untuk mencarinya, itulah yang akan saya lakukan dalam situasi seperti itu.
phk
ya, ini membantu tetapi dengan cara ini saya hanya memiliki yang terakhir. Apakah ada kemungkinan memiliki lebih dari satu hasil?
Faber
1
Anda dapat terus menekan Ctrl + R setelah Anda memasukkan bagian dari nama perintah.
mtahmed
history | lessmungkin? Itu tidak benar-benar menjawab pertanyaan Anda, tetapi di situlah saya mulai.
roaima
@roaima Dan kemudian mencari menggunakan "/" + istilah pencarian + masukkan dan kemudian "n" / "N" untuk pencarian selanjutnya maju / mundur.
phk

Jawaban:

2

Dengan menghubungkan ke PROMPT_COMMAND bash, fungsi ini dijalankan setiap kali Anda mendapatkan prompt baru, jadi ini saat yang tepat untuk memeriksa untuk melihat apakah Anda berada di direktori yang Anda inginkan untuk riwayat khusus. Fungsi ini memiliki empat cabang utama:

  1. Jika direktori saat ini ( $PWD) tidak berubah, maka jangan lakukan apa pun (kembali).

Jika PWD telah berubah, maka kami mengatur fungsi lokal yang hanya bertujuan untuk memfaktorkan kode "direktori khusus" menjadi satu tempat. Anda ingin mengganti direktori pengujian saya dengan milik Anda sendiri (dipisahkan oleh |).

  1. Jika kami belum mengubah ke atau keluar dari direktori khusus, maka cukup perbarui variabel "direktori sebelumnya" dan kembali dari fungsi.

Karena kami telah mengubah direktori, perbarui variabel "direktori sebelumnya", lalu simpan riwayat di dalam memori ke HISTFILE, lalu hapus riwayat di dalam memori.

  1. Jika kami telah berubah menjadi direktori khusus, maka setel HISTFILE menjadi .bash_historyfile di direktori saat ini.

  2. Jika tidak, kami telah mengubah dari direktori kustom, sehingga ulang HISTFILE dengan yang saham.

Akhirnya, karena kami telah mengubah file riwayat, bacalah kembali riwayat sebelumnya.

Untuk menyelesaikannya, skrip menetapkan nilai PROMPT_COMMAND dan menyimpan dua variabel penggunaan internal (stok HISTFILE dan "direktori sebelumnya").

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 Schaller
sumber
0

Jawaban Jeff sangat bagus jika Anda ingin histori untuk satu direktori, tetapi jika Anda baik-baik saja dengan menginstal zsh Anda bisa menggunakan per-history-direktori untuk mendapatkan histori spesifik ke direktori untuk semua direktori.

Anda dapat menginstal zsh dengan:

brew install zsh

Atau, jika Anda ingin menginstal oh-my-zsh , Anda dapat menambahkan di plugin histdb dan menulis kueri khusus untuk permintaan sqlite db yang ditambahkan histdb. Saya menulis tentang itu dan menambahkan pelengkapan otomatis dalam posting Dev Diaries . Periksa bagian perintah bonus .

Kueri terlihat seperti ini

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

Ini menerima batas opsional juga:

show_local_history 50

sebagai contoh.

Khaliq Gant
sumber
-1

Ketika saya perlu menggunakan perintah dengan argumen panjang beberapa kali, saya biasanya membuat alias di saya ~/.bash_aliasesatau Anda dapat memasukkannya ke dalam Anda ~/.bashrcjika Anda mau. Sangat mudah dan menghemat waktu alih-alih mencari perintah lama dalam sejarah.

andreatsh
sumber
1
Itu petunjuk yang bagus tapi bukan yang OP cari. OP cukup spesifik untuk apa yang dia cari (solusi saya akan mendaftar juga BTW).
phk
@ phk Anda benar, saya akan lebih berhati-hati lain kali! Terima kasih atas penjelasan anda!
andreatsh