it-swarm-pt.tech

Comando History dentro do script bash

O histórico é um comando interno do Shell que eu não poderia usar dentro de um script BASH. Então, existe uma maneira de conseguir isso usando o script BASH?
Aqui vamos nós meu script 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]
20
Vijay Ramachandran

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ê está tentando monitorar a atividade nesse servidor, o histórico do Shell é inútil (é trivial executar comandos que não aparecem no histórico). Veja 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 rastreamento de depuração: put set -x próximo ao topo do script. O rastreio é gravado no erro padrão.

33

Não tenho certeza se ele realmente usa o recurso de histórico ao executar de maneira não interativa; caso contrário, todos os scripts do Shell que você executar atrapalhariam seu histórico de comandos.

Por que não ir diretamente à fonte ${HOME}/.bash_history, substitua history | tail -100 com tail -100 ${HOME}/.bash_history. (Se você usar registros de data e hora, provavelmente precisará fazer algo como grep -v ^# ${HOME}/.bash_history | tail -100).

6
Kjetil Jorgensen

Se você quiser usar a saída do comando history de uma sessão ativa do Shell em um script, poderá usar um alias para executar o comando primeiro. Em seguida, no mesmo alias, você pode chamar o restante do script. Com essa configuração, você pode obter essencialmente o mesmo resultado que 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 isso:

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

Encontrei essa pergunta ao escrever um processo para combinar, classificar e sincronizar ~/bash_history arquivos em dois computadores, por isso será fácil pesquisar comandos que usei no passado.

É muito menos complicado atualizar meu arquivo de histórico cumulativo sem precisar fazer login em um novo Shell para ter ~/bash_history Atualizada. Para monitorar um servidor, obviamente isso 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 puxa todas as entradas exclusivas de todas as ~/.bash_history* arquivos.

2
clk

O histórico incorporado parece estar desativado dentro de um script do Shell. Veja aqui: http://www.tldp.org/LDP/abs/html/histcommands.html

Não encontrei nenhuma documentação oficial sobre isso.

2
lesmana

O comando history é desativado por padrão no script bash e é por isso que mesmo o comando history não funciona no arquivo .sh. para seu redirecionamento, redirecione gentilmente o arquivo bash_history dentro do arquivo .sh.

ou mecanismo de histórico também pode ser ativado, mencionando o arquivo de histórico e alterando os parâmetros de tempo de execução, conforme mencionado abaixo

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

nota: mencionado acima de duas linhas na parte superior do arquivo de script. agora o comando history funcionará na história.

1
linux.cnf

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ê deseja criar um script para realizar uma tarefa chamada "task" na qual você está trabalhando nas últimas 14 linhas, execute

script.sh task 14

Depois limpe sua história para criar um roteiro bacana!

1
Eric

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

0
amit singh