Crie um wrapper em torno do bash usando uma função bash

Crie um wrapper em torno do bash usando uma função bash

Tenho um pouco de medo de mexer nas configurações do histórico do bash e só quero escrever meu próprio histórico personalizado do bash. Pensei em usar uma função bash como esta:

bash(){

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

  command bash "$@" 

}

export -f bash;

mas isso não funciona muito bem - o que acontece é que o command bashassume o controle e as coisas não passam mais pela função bash. Eu preciso que todo o stdin do bash passe por essa função bash para que tudo seja gravado em um arquivo personalizado. Alguém tem uma ideia de como fazer isso?

Responder1

O que você deseja é uma DEBUGarmadilha (executada antes de cada comando) ou possivelmente uma PROMPT_COMMAND(executada antes de cada prompt).

A armadilha está mais perto da sua tentativa. O conceito básico é descrito emO bash tem um gancho que é executado antes de executar um comando?e uma versão pronta para uso polida existe comobash-preexec.

Segundo seu autor, bash-preexec é usado porBash Hubpara fornecer "histórico do bash na nuvem", então tenho certeza de que está à altura da tarefa de "histórico do bash em um arquivo".

Responder2

Você está tentando implementar algo equivalente aesta "história eterna":

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

A ideia central é que history 1(no bash) liste a última linha dada ao bash.

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

Que na verdade só tem um valor significativo (não a mesma linha) dentro de um script.

E; PROMPT_COMMANDexecuta o historycomando para cada nova linha fornecida ao bash.

IMO: Não parece ser uma boa ideia nomear uma função bash.

informação relacionada