Existe um monte de ferramentas como 'script', 'screen', 'ttyrec' que permitem o registro de conteúdo das sessões de shell. Por design, essa ferramenta registra tudo exibido em pty, incluindo caracteres de controle. No entanto, parece não haver solução para remover os caracteres de controle e exibir a transcrição da sessão gravada que foi vista pelo usuário. Mesmo programas de repetição parecem não funcionar corretamente com comandos de várias linhas.
Eu gastei algum tempo tentando fazer um parser adequado para os typescript, e cheguei à conclusão de que é de fato impossível no caso geral. O problema é emuladores de terminal modernos (terminator, xterm, rxvt) recurso de quebra de linha automática e shells (bash, zsh) fazer uso dele. As coisas funcionam bem para o processo de shell interativo porque ele é capaz de se manter em sincronia com a largura do terminal e ajustar as posições do cursor conforme necessário. Infelizmente, o 'script' (nem outras ferramentas, até onde eu posso ver) não rastreia os eventos de mudança de tamanho do pty, e essa informação simplesmente se perde. Como resultado, uma ferramenta que renderiza o texto datilografado não tem informações suficientes e não pode reconstruir a aparência de comandos com várias linhas.
Eu perdi alguma coisa? Existe uma solução?
Eu vejo as seguintes possíveis soluções, mas nenhuma delas é fácil nem completa:
- Use o shell sem um editor de linha de comando sofisticado (como o shell bourne)
- Sempre execute com 'set -x' ativado (gera muita confusão com o preenchimento automático de comandos no bash)
- Ferramenta 'script' (e 'tela') do patch para gravar alterações de tamanho pty (no Linux ele pode alimentar informações de tempo para stderr já, seria lógico adicionar eventos de mudança de tamanho pty lá)
- Invente algum algoritmo astuto para analisar o texto datilografado bagunçado. Por exemplo, o shell envia o CR quando ele precisa ir para outra linha durante a edição do comando de várias linhas. Ele envia CR + NL quando o usuário envia o comando. Infelizmente o bash também envia CR ao manusear alguns comandos Ctrl-U do usuário.
- Obtenha o texto do comando (que está sendo confuso no texto datilografado) de outra fonte, por exemplo, do histórico do shell. Mas isso exigiria a personalização dos scripts de perfil do shell, etc.