Comando History dentro do script bash

16

Eu tenho batido minha cabeça para escrever um roteiro de história simples nos últimos dois dias. O histórico é um comando construído em shell que não consegui usar em um script BASH. Então, existe uma maneira de obter isso usando o script BASH?
Aqui vamos nós meu roteiro para você:

#!/bin/bash
history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]
    
por Vijay Ramachandran 11.01.2011 / 14:54

7 respostas

25

O Bash desabilita o histórico em shells não interativos por padrão, mas você pode ativá-lo.

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …

Mas se você estiver tentando monitorar a atividade nesse servidor, o histórico do shell é inútil (é trivial executar comandos que não aparecem no histórico). Consulte Como posso registrar todos os lançamentos de processos no Linux .

Se você estiver depurando um script, o histórico do shell não é a melhor maneira de obter informações úteis. Uma ferramenta muito melhor é o recurso de rastreio de depuração: coloque set -x próximo ao início do script. O rastreio é gravado no erro padrão.

    
por 11.01.2011 / 22:07
6

Não tenho certeza se ele realmente usa o recurso de histórico ao executar de forma não interativa, caso contrário, cada script de shell executado atrapalharia seu histórico de comandos.

Por que não ir diretamente para a fonte ${HOME}/.bash_history , substitua history | tail -100 por tail -100 ${HOME}/.bash_history . (Se você usa timestamps, você provavelmente teria que fazer algo nos moldes de grep -v ^# ${HOME}/.bash_history | tail -100 ).

    
por 11.01.2011 / 15:09
1

O histórico embutido parece estar desativado dentro de um script de shell. Veja aqui: link

Eu não encontrei nenhuma documentação oficial sobre isso.

    
por 11.01.2011 / 18:14
1

Crie um script chamado script.sh como abaixo. Ele cria um script chamado X e coloca Y Número de linhas do seu histórico nele.

#!/bin/bash
SCRIPT_NAME=$1
NUMBER_OF_LINES_BACK=$2

# Enable History in a non interactive shell
HISTFILE=~/.bash_history
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;
~

Então, se você quiser criar um script para realizar uma tarefa chamada "tarefa" na qual você está trabalhando nas últimas 14 linhas, execute

script.sh task 14

Em seguida, limpe sua história para criar um roteiro legal!

    
por 23.11.2015 / 04:58
1

Se você quiser usar a saída do comando history de uma sessão de shell ativa em um script, poderá usar um alias para executar o comando primeiro. Então, no mesmo alias, você pode chamar o restante do script. Com essa configuração, você pode obter essencialmente o mesmo resultado que ter o comando history no script real.

Por exemplo, você pode criar um alias como este, assumindo que o nome do script seja script.sh:

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

E mude o script para isto:

#!/bin/bash
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]

Eu encontrei essa pergunta enquanto escrevia um processo para combinar, classificar e sincronizar ~/bash_history arquivos em dois computadores, assim será fácil pesquisar os comandos que usei no passado.

É muito menos complicado atualizar meu arquivo de histórico cumulativo sem ter que fazer login em um novo shell para ter o ~/bash_history atualizado. Para monitorar um servidor, isso obviamente não funcionará, como mencionado nas outras respostas.

Meu uso em particular é:

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

O script hby.sh , em seguida, extrai todas as entradas exclusivas de todos os arquivos ~/.bash_history* .

    
por 19.07.2016 / 06:24
0

Todo usuário tem seu próprio arquivo de histórico que é resultado do comando history.Em vez de usar o comando history em seu shell script, você pode usar o arquivo histórico para o usuário. Haverá um arquivo .bash_history no diretório home do usuário, que será o arquivo histórico para o usuário.

    
por 23.11.2015 / 10:51
-1

Resposta curta :

use history -p para realizar a expansão do histórico explicitamente.

Segue um exemplo.

Um caso de uso acontece muito para mim é:

  • o comando anterior obtém uma lista de nomes de arquivos e imprime em stdout,
  • Eu preciso editar esse arquivo com o vim.

Como meu bash foi set -o histexpand , normalmente o que fiz foi digitar

vim $(!!)

para editar os arquivos listados pelo comando anterior.

Infelizmente, às vezes acontece um erro, por isso, ative a verificação por shopt -s histverify .

Agora posso verificar a expansão, com o custo de uma chave extra Return .

Hoje eu quero envolver esses detalhes em uma função bash, já que eu os uso muito,

function vk() {
    set -o history && set -o histexpand;
    vim -i ~/.viminfok $($(history -p !!));
}

Aqui eu uso dois command substitution aninhados, o interno para expandir !! para o comando anterior, o externo para executá-lo e obter a saída.

Agora eu posso conseguir o mesmo efeito, com apenas três chaves, e uma delas é Return !

    
por 31.08.2017 / 04:39