«History» cesse de fonctionner lorsqu'il est exécuté dans le script bash

9

J'écris un script simple pour grep mon historique bash pour trouver une chaîne particulière. Sur la ligne de commande, je peux faire ce qui suit, ce qui fonctionne bien:

history | grep git

Cependant, lorsque je crée un script bash avec la même commande que ci-dessus, historyne renvoie soudainement rien:

#!/bin/bash
history | grep git

Lorsque je supprime la première ligne #!/bin/bash, mon script fonctionne à nouveau. Que se passe-t-il ici? Comment puis-je utiliser à l' historyintérieur d'un script bash?

Martin Vegter
la source

Réponses:

8

Ce qui suit est pour bash 4.0 or higher only, mais il fait l'affaire. :)

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

Travaux! Essaye le. ( -i= i nteractif, un indicateur non disponible pour bash 3.x et versions antérieures)

erreur de syntaxe
la source
Merci aussi au mec qui m'a récemment rétrogradé juste parce qu'il le peut. (Probablement un bashutilisateur v3, par simple frustration, haha). Au moins pour Martin, ma solution m'a été d'une grande aide, c'est (au moins) un réconfort.
syntaxerror
J'avais la même question lorsque j'écrivais un outil qui enregistre le travail après les heures de bureau pour les ingénieurs de support 24/7 .. merci!
Henry van Megen
14

Lorsque vous exécutez un script shell bash, par exemple en exécutant un fichier exécutable dont la ligne shebang est #!/bin/bash, le script est exécuté dans un shell non interactif. L'une des caractéristiques d'un shell non interactif est que l'historique est désactivé. Donc, si vous voulez que votre script puisse utiliser l'historique, vous devez faire quelque chose comme ceci:

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

Bien sûr, dans ce cas, vous auriez pu faire:

grep git ~/.bash_history

Étant donné que les deux éléments ci-dessus nécessitent que le fichier historique ( ~/.bash_history) soit à jour, ce qui ne sera certainement pas le cas.

Je ne sais pas comment vous exécutez votre script après la suppression de la ligne shebang. La recherche du fichier (par exemple, avec .) est pas la même chose que l'exécution du script car les commandes s'exécutent dans le shell actuel, qui a l'historique activé.

rici
la source
Que diriez-vous de faire history -ajuste après la commande set pour vous assurer que les dernières commandes sont ajoutées au fichier en premier?
4
@ illuminÉ: n'aidera pas. Le shell a commencé à exécuter le script est un processus complètement différent; ça commence par une franche histoire vide.
rici