Cree un contenedor alrededor de bash usando una función bash

Cree un contenedor alrededor de bash usando una función bash

Soy un poco cauteloso a la hora de alterar la configuración del historial de bash y solo quiero escribir mi propio historial de bash personalizado. Pensé en usar una función bash como esta:

bash(){

  # write to a custom history file manually
  echo "$@" >> $HOME/my_bash_history

  command bash "$@" 

}

export -f bash;

pero esto no funciona del todo; lo que sucede es que se command bashhace cargo y las cosas ya no pasan por la función bash. Necesito que todas las entradas estándar de bash pasen por esta función bash para que todo se escriba en un archivo personalizado. ¿Alguien tiene una idea sobre cómo hacer esto?

Respuesta1

Lo que quieres es una DEBUGtrampa (ejecutar antes de cada comando) o posiblemente unaPROMPT_COMMAND (ejecutar antes de cada mensaje).

La trampa está más cerca de tu intento. El concepto básico se describe en¿Bash tiene un gancho que se ejecuta antes de ejecutar un comando?y existe una versión pulida llave en mano comobash-preexec.

Según su autor, bash-preexec es utilizado porBashhubpara proporcionar "historial de bash en la nube", así que estoy seguro de que está a la altura de la tarea de "historial de bash en un archivo".

Respuesta2

Estás intentando implementar algo equivalente aesta "historia eterna":

export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo $$ $USER \
           "$(history 1)" >> ~/.bash_eternal_history'

La idea central es que history 1(en bash) enumera la última línea dada a bash.

$ echo "$(history 1)"
12766  2019-05-31T20:14:44+0000 echo "$(history 1)"

Que en realidad sólo tiene un valor significativo (no la misma línea) dentro de un script.

Y; PROMPT_COMMANDejecuta el historycomando para cada nueva línea dada a bash.

En mi opinión: no parece una buena idea nombrar una función bash.

información relacionada