Ricordi la cronologia bash "locale" in una cartella?


11

Ho uno script in una cartella che uso con argomenti lunghi. C'è qualche possibilità che io possa avere una cronologia dei comandi eseguiti in quella specifica directory invece di ripercorrere l'intera storia?


3
Domanda interessante. A proposito, invece di tornare indietro "attraverso l'intera storia" potresti usare Ctrl + R per cercarlo, ecco cosa farei in tali situazioni.
phk,

sì, aiuta ma in questo modo ho solo l'ultimo. C'è qualche possibilità di avere più di un risultato?
faber,

1
Puoi continuare a premere Ctrl + R dopo aver inserito parte del nome del comando.
mtahmed,

history | lessForse? In realtà non risponde alla tua domanda, ma è da lì che vorrei iniziare.
roaima,

@roaima E poi la ricerca utilizzando "/" + cercare termine + entrare e poi "n" / "N" per ulteriori ricerche avanti / indietro.
phk,

Risposte:


2

Collegandosi a PROMPT_COMMAND di bash, questa funzione viene eseguita ogni volta che si riceve un nuovo prompt, quindi è un momento decente per verificare se ci si trova in una directory per la quale si desidera una cronologia personalizzata. La funzione ha quattro rami principali:

  1. Se la directory corrente ( $PWD) non è cambiata, non fare nulla (return).

Se il PWD è cambiato, allora impostiamo una funzione locale il cui unico scopo è di fattorizzare il codice "directory personalizzata" in un unico posto. Ti consigliamo di sostituire le mie directory di test con le tue (separate da |).

  1. Se non siamo passati da o verso una directory personalizzata, è sufficiente aggiornare la variabile "directory precedente" e tornare fuori dalla funzione.

Dato che abbiamo cambiato directory, aggiorna la variabile "directory precedente", quindi salva la cronologia in memoria nel HISTFILE, quindi cancella la cronologia in memoria.

  1. Se siamo passati a una directory personalizzata, imposta HISTFILE come .bash_historyfile nella directory corrente.

  2. Altrimenti, siamo passati da una directory personalizzata, quindi reimpostare HISTFILE su quello stock.

Infine, poiché abbiamo modificato i file della cronologia, rileggili nella cronologia precedente.

Per iniziare, lo script imposta il valore PROMPT_COMMAND e salva due variabili di uso interno (il file HISTFILE e la "directory precedente").

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

La risposta di Jeff è ottima se vuoi la cronologia per una singola directory, ma se stai bene con l'installazione di zsh potresti usare la directory per-history per ottenere una cronologia specifica della directory per tutte le directory.

Puoi installare zsh:

brew install zsh

In alternativa, se si desidera installare oh-my-zsh , è possibile aggiungere il plug-in histdb e scrivere una query personalizzata per interrogare il db sqlite che histdb aggiunge. Ho scritto su questo e aggiungendo i completamenti automatici in un post Dev Diaries . Controlla la sezione dei comandi bonus .

La query è simile a questa

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

Questo accetta anche un limite opzionale:

show_local_history 50

per esempio.


-1

Quando ho bisogno di usare più volte un comando con argomenti lunghi, di solito creo un alias nel mio ~/.bash_aliaseso puoi inserirlo nel tuo ~/.bashrcse preferisci. È facile e risparmia tempo invece cerca i vecchi comandi nella storia.


1
Questo è un buon suggerimento, ma non quello che OP stava cercando. L'OP era abbastanza specifico per quello che stava cercando (una soluzione che avrei sottoscritto anche BTW).
phk,

@phk hai ragione, la prossima volta starò più attento! Grazie per la tua spiegazione!
andreatsh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.