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)
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?
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.