Como logar em qual sessão de terminal um comando zsh foi executado

3

No arquivo de histórico do zsh, todos os comandos são registrados em todas as sessões de terminal. Existe alguma maneira de registrar em qual sessão de terminal um comando foi executado (ou seja, um identificador exclusivo para essa instância do shell?).

Um possível caso de uso para isso seria examinar o arquivo de histórico e determinar o que foi executado antes ou depois de um determinado comando, restrito a essa sessão precisa.

    
por a3nm 18.10.2012 / 12:08

1 resposta

1

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 ...

    
por 31.01.2013 / 18:47