"History" smette di funzionare quando eseguito all'interno dello script bash


9

Sto scrivendo un semplice script per grep la mia storia bash per trovare una stringa particolare. Sulla riga di comando, posso fare quanto segue, che funziona benissimo:

history | grep git

Tuttavia, quando creo uno script bash con lo stesso comando di cui sopra, improvvisamente historynon restituisce nulla:

#!/bin/bash
history | grep git

Quando rimuovo la prima riga #!/bin/bash, il mio script funziona di nuovo. Cosa sta succedendo qui? Come posso usare historyall'interno di uno script bash?

Risposte:


8

Quanto segue è per bash 4.0 or higher only, ma fa il trucco. :)

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

Lavori! Provalo. ( -i= i nteractive, un flag non disponibile per bash 3.xe precedenti)


Grazie anche al tizio che recentemente mi ha votato per il solo fatto che può. (Probabilmente un bashutente v3, per pura frustrazione, ahah). Almeno per Martin la mia soluzione è stata di grande aiuto, questo è (almeno) un conforto.
syntaxerror

Ho avuto la stessa domanda quando stavo scrivendo uno strumento che registra il lavoro dopo l'orario di ufficio per gli ingegneri del supporto 24/7 .. grazie!
Henry van Megen,

14

Quando si esegue uno script della shell bash, ad esempio eseguendo un file eseguibile la cui linea shebang è #!/bin/bash, lo script viene eseguito in una shell non interattiva. Una delle caratteristiche di una shell non interattiva è che la cronologia è disabilitata. Quindi se vuoi che il tuo script sia in grado di usare la cronologia, dovresti fare qualcosa del genere:

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

Certo, in questo caso avresti potuto fare:

grep git ~/.bash_history

Poiché entrambi i precedenti richiedono che il file di cronologia ( ~/.bash_history) sia aggiornato, cosa che quasi sicuramente non lo sarà.

Non sono sicuro di come esegui lo script dopo che la riga shebang è stata rimossa. Il sourcing del file (ad es., Con .) non equivale all'esecuzione dello script poiché i comandi vengono eseguiti nella shell corrente, che ha la cronologia abilitata.


Che ne dici di fare history -asubito dopo il comando set per assicurarti che gli ultimi comandi vengano aggiunti prima al file?

4
@ illuminÉ: non aiuta. La shell che ha iniziato a eseguire lo script è un processo completamente diverso; inizia con una storia vuota.
rici,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.