Se você alterar o arquivo de histórico, você criará problemas para você mesmo!
No entanto, é possível registrar os comandos em um arquivo separado. Você pode alterar a ação que é executada quando você executa uma linha para incluir o registro da linha atual e, em seguida, você pode consultá-lo para obter as informações desejadas.
Vamos primeiro definir uma função que pode registrar a linha atual e depois executá-la:
function log_and_accept {
echo "$TTY $BUFFER" >> /tmp/log
zle accept-line
}
Agora $ TTY é um identificador para o seu shell atual, mas não é o único que você pode usar. $ TTY é um caminho para um arquivo / dev / pts / NUMBER. O único problema aqui é que esse número é sempre o próximo número disponível, então se você fechar um terminal e abrir outro, então você irá reutilizar o mesmo número tty.
Se você não gostar disso, também é possível obter um caminho que inclua o id do processo do shell (os IDs do processo também podem ser reutilizados, mas é menos provável que isso o atrapalhe - os IDs do processo são usados por todos os processos, enquanto os ttys são apenas terminais). Isso pode ser feito facilmente graças ao link simbólico / proc / self, que sempre aponta para a pasta do processo para o processo que o examina. Então, para usar a pasta do processo, a função acima seria:
function log_and_accept {
process=/proc/self
echo "${process:A} $BUFFER" >> /tmp/log
zle accept-line
}
Agora, depois de decidir como você deseja identificar a linha, a próxima parte é substituir o comportamento padrão pela nova função. O comportamento padrão que estamos substituindo é a função de linha de aceitação, e se olharmos para a documentação do zle , você verá que a linha de aceitação está ligada a ^ J e ^ M.
Para vincular essa função a essas letras, primeiro você precisa transformá-la em um widget:
zle -N log_and_accept_widget log_and_accept
Então você pode ligá-lo, substituindo o antigo comportamento:
bindkey '^J' log_and_accept_widget
bindkey '^M' log_and_accept_widget
Agora o zsh tem suporte a várias linhas, portanto, quando você consultar esse arquivo, poderá descobrir que as linhas acabam sendo menos claras do que você esperava originalmente. Aqui estão algumas das saídas do arquivo que geramos enquanto testava:
/proc/19170 function log_and_accept {
shell=/proc/self
echo "${shell:A} $BUFFER" >> /tmp/log
zle accept-line
}
/proc/19170 echo woo
/proc/19170 cat /tmp/log
Você pode muito bem querer passar o $ BUFFER através de uma bonita impressora de algum tipo antes de registrá-lo.
Se você tiver problemas ao fazer isso e realmente quiser o comportamento antigo, poderá restaurá-lo com:
bindkey '^J' accept-line
bindkey '^M' accept-line
Embora a execução desses comandos seja realmente difícil ...