Exportar histórico de comandos para um script de shell

2

Frequentemente tenho procedimentos de instalação complicados a seguir, como ter que construir dependências para buildtools, para construir dependências para o aplicativo que eu gostaria de instalar a partir do código fonte.

Depois de fazer isso uma vez, realmente não quero ter que tentar lembrar de todas as etapas que fiz.

O comando-history em zsh (e outros shells) já registra o que eu fiz. É possível exportar os últimos 100 (por exemplo) comandos executados em um script .sh ?

Eu poderia editar esse script, remover comandos que eram antes de começar a instalar, e remover comandos que estavam me enganando, e fique com um script de instalação que posso dar a alguém em um ambiente similar. (Ou use-me em outra máquina.).

Eu suspeito que meu histórico de comandos já está armazenado em um dos arquivos de ponto no meu diretório pessoal.

    
por Lyndon White 28.01.2015 / 00:48

2 respostas

7

O comando interno fc permite que você extraia comandos do histórico usando vários critérios (consulte man zshbuiltins para obter detalhes).

fc significa "fix command" e, quando invocado sem parâmetros, abre um editor com o último comando digitado. Você pode usar todos os recursos do seu editor para alterar o comando e, quando salvar e sair, zsh executará o comando fixo. O editor usado por padrão é vi , mas isso pode ser substituído usando a variável EDITOR shell ou, se você quiser usar um editor específico com o comando fc , FCEDIT .

fc tem muitas opções para manipular o histórico além do último comando, algumas das quais fornecem exatamente os recursos que você está solicitando.

A opção -l "lista" o conteúdo do histórico. Por padrão, ele lista os últimos 16 comandos, mas você pode especificar limites inferiores e superiores, como índices no histórico ou até como o texto inicial de um comando. Índices negativos voltam do último comando, para extrair as últimas 15 linhas:

fc -l -15

Por padrão, fc -l inclui índices de histórico como a primeira coluna de sua saída. Assim que você tiver o intervalo exato desejado, -n descartará os números assim:

fc -ln -12 -5

extrairá apenas essas linhas (de 12 de volta para 5 de volta) em um formato adequado para um script.

Usar comandos como limites pode ser muito útil:

fc -l rm ls

lista todo o histórico começando com o último rm e terminando com o último ls (então haverá um único comando rm na saída, mas pode haver vários comandos ls ).

Existem muitas outras opções, como adicionar registros de data e hora, substituir porções de comandos, carregar e salvar partes do histórico, alternando pilhas de histórico inteiras ...

    
por 28.01.2015 / 01:01
0

Correção por @jimmij

originalmente escrevi isso com o shell errado em mente (bash em vez de zsh). o abaixo reflete o código corrigido

Em esta resposta do stackoverflow :

history | cut -c 8-

Além disso, para restringir o histórico a um certo número de linhas, execute

history -<number of lines> (history -20 prints the last 20 entries)

Finalmente: history -20 | cut -c 8- > commands_list.sh

Coloque um #!/bin/bash #!/bin/zsh no início desse arquivo, chmod +x commands_list.sh , pronto.

    
por 28.01.2015 / 00:55