O histórico é um comando embutido no 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" hello@hel.com
fonte
histtest.sh: 5: set: Illegal option -o history
sh
está julgando pela letra exata da mensagem de erro). Para acessar o histórico do bash, você precisa usar o bash (script começando com#!/bin/bash
ou#!/usr/bin/env bash
).Illegal option
(diriaset: history: invalid option name
).set -o history
ao histórico, que serão preenchidos com entradas comoif [...
vars=$(...
etc. #set -x
será muito mais útil.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 de shell que você executar atrapalhariam seu histórico de comandos.
Por que não ir diretamente à fonte
${HOME}/.bash_history
, substituahistory | tail -100
portail -100 ${HOME}/.bash_history
. (Se você usar registros de data e hora, provavelmente precisará fazer algo como essegrep -v ^# ${HOME}/.bash_history | tail -100
).fonte
greq -v '^#[0-9]\+$'
(eu, por vezes, "executar" comentários no meu shell ...)history
e a saída dogrep
método ...history -a; history -c; history -r
. (adicionar, limpar, ler)Se você quiser usar a saída do
history
comando 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 de ter ohistory
comando no script real.Por exemplo, você pode criar um alias como este, assumindo que o nome do script seja script.sh:
E mude o script para isto:
Encontrei essa pergunta ao escrever um processo para combinar, classificar e sincronizar
~/bash_history
arquivos em dois computadores, para que seja 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
~/bash_history
atualizá-lo. Para monitorar um servidor, obviamente isso não funcionará, como mencionado nas outras respostas.Meu uso em particular é:
O script
hby.sh
puxa todas as entradas exclusivas de todos os~/.bash_history*
arquivos.fonte
O histórico incorporado parece estar desativado dentro de um script de shell. Veja aqui: http://www.tldp.org/LDP/abs/html/histcommands.html
Não encontrei nenhuma documentação oficial sobre isso.
fonte
Crie um script com o nome
script.sh
abaixo. Ele cria um script chamado X e coloca Y Número de linhas do seu histórico nele.Então, se você deseja criar um script para realizar uma tarefa chamada "task" na qual você trabalhou nas últimas 14 linhas, execute
Depois limpe sua história para criar um bom roteiro!
fonte
histtest.sh: 5: set: Illegal option -o history
O comando history está desativado por padrão no script bash, por isso, 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
nota: mencionado acima de duas linhas na parte superior do arquivo de script. agora o comando history funcionará na história.
fonte
Todo usuário tem seu próprio arquivo de histórico, resultado do comando history. Em vez de usar o comando history em seu script de 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.fonte
Resposta curta :
usar
history -p
para executar explicitamente a expansão do histórico.Um exemplo a seguir.
Um caso de uso acontece muito para mim é:
Desde que minha festa foi
set -o histexpand
, geralmente o que eu fiz foi digitarpara editar os arquivos listados pelo comando anterior.
Às vezes, infelizmente, erros acontecem, então eu habilito a verificação por
shopt -s histverify
.Agora posso verificar a expansão, com o custo de uma Returnchave extra .
Hoje eu quero agrupar esses detalhes em uma função bash, já que os uso muito,
Aqui eu uso dois aninhados
command substitution
, 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!
fonte