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

11

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

faber
fuente
3
Interesante pregunta. Por cierto, en lugar de volver "a través de todo el historial", puede usar Ctrl + R para buscarlo, eso es lo que haría en tales situaciones.
phk
Sí, ayuda, pero de esta manera solo tengo el último. ¿Hay alguna posibilidad de tener más de un resultado?
faber
1
Puede seguir presionando Ctrl + R una vez que haya ingresado parte del nombre del comando.
mtahmed
history | less¿quizás? Realmente no responde a tu pregunta, pero ahí es donde comenzaría.
roaima
@roaima Y luego buscar usando "/" + término de búsqueda + enter y luego "n" / "N" para seguir buscando hacia adelante / hacia atrás.
phk

Respuestas:

2

Al engancharse a PROMPT_COMMAND de bash, esta función se ejecuta cada vez que recibe una nueva solicitud, por lo que es un momento decente para verificar si está 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 (volver).

Si el PWD ha cambiado, entonces 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 (separados por |).

  1. Si no hemos cambiado dentro o fuera de un directorio personalizado, simplemente actualice la variable "directorio anterior" y regrese de la función.

Como hemos cambiado los directorios, actualice la variable "directorio anterior", luego guarde el historial en memoria en HISTFILE, luego borre el historial en memoria.

  1. Si hemos cambiado a un directorio personalizado, configure HISTFILE para que sea un .bash_historyarchivo en el directorio actual.

  2. De lo contrario, hemos cambiado de un directorio personalizado, por lo que restablece HISTFILE al stock.

Finalmente, como hemos cambiado 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 archivo HISTFILE 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
Jeff Schaller
fuente
0

La respuesta de Jeff es excelente si desea el historial de un solo directorio, pero si está de acuerdo con la instalación de zsh , puede usar el directorio por historial para obtener un historial específico del directorio para todos los directorios.

Puede instalar zsh de la siguiente manera:

brew install zsh

Alternativamente, si desea instalar oh-my-zsh , puede agregar el complemento histdb y escribir una consulta personalizada para consultar el sqlite db que agrega histdb. Escribí sobre eso y agregué autocompletados en una publicación de Dev Diaries . Consulte la sección de comandos de bonificació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 acepta un límite opcional también:

show_local_history 50

por ejemplo.

Khaliq Gant
fuente
-1

Cuando necesito usar un comando con argumentos largos varias veces, generalmente 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 la historia.

andreatsh
fuente
1
Esa es una buena pista, pero no es lo que OP estaba buscando. OP era bastante específico para lo que él / ella estaba buscando (una solución que yo también registraría).
phk
@phk Tienes razón, ¡tendré más cuidado la próxima vez! ¡Gracias por tu explicación!
andreatsh