“history” pára de funcionar quando é executado dentro do script bash

7

Estou escrevendo um script simples para reunir meu histórico bash para encontrar uma string específica. Na linha de comando, posso fazer o seguinte, que funciona bem:

history | grep git

No entanto, quando eu crio um script com o mesmo comando acima, de repente history não retorna nada:

#!/bin/bash
history | grep git

Quando eu removo a primeira linha #!/bin/bash , meu script funciona novamente. O que esta acontecendo aqui? Como posso usar history dentro de um script bash?

    
por Martin Vegter 03.02.2014 / 21:41

2 respostas

5

O seguinte é para bash 4.0 or higher only , mas é o suficiente. :)

#!/bin/bash -i
history | grep sometext

Funciona! Experimente. ( -i = i nteractive, um sinalizador não disponível para bash 3.xe anterior)

    
por 09.12.2014 / 23:38
12

Quando você executa um script de shell bash, por exemplo, executando um arquivo executável cuja linha shebang é #!/bin/bash , o script é executado em um shell não interativo. Um dos recursos de um shell não interativo é que o histórico está desativado. Então, se você quiser que seu script possa usar o histórico, precisará fazer algo assim:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Claro que, neste caso, você poderia ter acabado de fazer:

grep git ~/.bash_history

Como os dois itens acima exigem que o arquivo de histórico ( ~/.bash_history ) esteja atualizado, o que quase certamente não acontecerá.

Não sei ao certo como você executa seu script depois que a linha shebang é removida. O fornecimento do arquivo (por exemplo, com . ) é não o mesmo que executar o script porque os comandos são executados no shell atual, que tem histórico ativado.

    
por 03.02.2014 / 22:28