¿Recuerda el historial de bash "local" en una carpeta?

¿Recuerda el historial de bash "local" en una carpeta?

Tengo un script en una carpeta que uso con argumentos largos. ¿Existe alguna posibilidad de que pueda tener un historial de los comandos ejecutados en ese directorio específico en lugar de revisar todo el historial?

Respuesta1

Al conectarse a PROMPT_COMMAND de bash, esta función se ejecuta cada vez que recibe un nuevo mensaje, por lo que es un buen momento para verificar si se encuentra en un directorio para el que desea un historial personalizado. La función tiene cuatro ramas principales:

  1. Si el directorio actual ( $PWD) no ha cambiado, no haga nada (regrese).

Si la persona con discapacidadtienecambiado, luego configuramos una función local cuyo único propósito es factorizar el código del "directorio personalizado" en un solo lugar. Querrás reemplazar mis directorios de prueba con los tuyos propios (separados por |).

  1. Si no hemos entrado o salido de un directorio personalizado, simplemente actualice la variable "directorio anterior" y salga de la función.

Como cambiamos de directorio, actualice la variable "directorio anterior", luego guarde el historial en memoria en HISTFILE y luego borre el historial en memoria.

  1. si hemos cambiadoenun directorio personalizado, luego configure HISTFILE para que sea un .bash_historyarchivo en el directorio actual.

  2. De lo contrario, hemos cambiadofuera deun directorio personalizado, así que restablezca HISTFILE al directorio original.

Finalmente, dado que cambiamos los archivos del historial, vuelva a leer el historial anterior.

Para que todo funcione, el script establece el valor PROMPT_COMMAND y guarda dos variables de uso interno (el HISTFILE estándar y el "directorio anterior").

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

Respuesta2

jeffrespuestaes genial si quieres el historial de un único directorio, pero si estás de acuerdo con instalarzshpodrías usarpor directorio históricopara obtener un historial específico del directorio para todos los directorios.

Puede instalar zsh mediante:

brew install zsh

Alternativamente, si desea instalaroh-mi-zsh, podrías agregar elhistdbcomplemento y escriba una consulta personalizada para consultar la base de datos sqlite que agrega histdb. Escribí sobre eso y agregué terminaciones automáticas en unDiarios de desarrollocorreo. Comprobar elcomandos de bonificaciónsección.

La consulta se ve así

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

Esto también acepta un límite opcional:

show_local_history 50

Por ejemplo.

Respuesta3

Cuando necesito usar un comando con argumentos largos varias veces, normalmente creo un alias en mi ~/.bash_aliaseso puedes ponerlo en tu ~/.bashrcsi lo prefieres. Es fácil y ahorra tiempo. En lugar de buscar comandos antiguos en el historial.

información relacionada