"History" para de funcionar quando executado dentro do script bash

9

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

history | grep git

No entanto, quando eu crio um script bash com o mesmo comando acima, de repente historynada retorna:

#!/bin/bash
history | grep git

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

Martin Vegter
fonte

Respostas:

8

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

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

Trabalho! Experimente. ( -i= I Nteractive, uma bandeira não disponível para 3.x bash e mais cedo)

erro de sintaxe
fonte
Agradeço também ao cara que recentemente me rebaixou só porque ele pode. (Provavelmente um bashusuário v3, por mera frustração, haha). Pelo menos para Martin, minha solução foi de grande ajuda, isso é (pelo menos) um consolo.
syntaxerror
Eu tive a mesma pergunta quando estava escrevendo uma ferramenta que registra o trabalho após o horário comercial para engenheiros de suporte 24/7. Obrigado!
Henry van Megen
14

Quando você executa um script do 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. Portanto, 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

Obviamente, nesse caso, você poderia ter acabado de fazer:

grep git ~/.bash_history

Como as duas opções acima exigem que o arquivo de histórico ( ~/.bash_history) esteja atualizado, o que quase certamente não será.

Não sei como você executa seu script após a remoção da linha shebang. Fornecer o arquivo (por exemplo, with .) não é o mesmo que executar o script, porque os comandos são executados no shell atual, que tem o histórico ativado.

rici
fonte
Que tal fazer history -alogo após o comando set para garantir que os últimos comandos sejam anexados ao arquivo primeiro?
4
@ illuminÉ: não vai ajudar. O shell começou a executar o script é um processo completamente diferente; Começa com um histórico vazio.
rici