Tout d'abord, notez que votre historique est déjà dans un fichier. Si vous utilisez bash, son nom est généralement ~/.bash_history
. Plus précisément, c'est ce que vous avez défini pour la variable HISTFILE
. Si vous souhaitez le copier dans un autre fichier, lancez simplementcat "$HISTFILE" > hist.txt
Maintenant, pour savoir pourquoi la history
commande ne fonctionne pas dans un script shell bash, c'est parce que les scripts sont exécutés dans un shell enfant non interactif de votre session shell actuelle. Les shells enfants n'héritent pas de tout l'environnement du parent (donc pas toutes les variables définies), seulement les variables qui ont été exportées. Pour illustrer, le script ci-dessous fera écho à la valeur de la variable $var
:
#!/bin/bash
echo "$var"
Maintenant, définissez $var
quelque chose et exécutez le script:
$ var="foo"
$ foo.sh
VAR:
Ensuite, exportez d'abord la variable:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
Comme vous pouvez le voir, lorsque la variable a été exportée, elle est disponible pour les shells enfants.
Comme je l'ai mentionné précédemment, l'historique est stocké dans le fichier pointé par la variable $HISTFILENAME
. Parce que ce n'est pas exporté par défaut, il n'est pas défini lors de l'exécution d'un script:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
Comme vous pouvez le voir dans l'exemple ci-dessus, la variable HISTFILE
est définie dans ma session shell normale, mais est vide lors de l'exécution du script.
Donc, pour obtenir l'historique, vous avez quelques options:
La HISTFILE
valeur par défaut est $HOME/.bash_history
. Si vous n'avez pas changé cela, vous pouvez simplement exécuter cette commande dans votre script:
cat "$HOME/.bash_history" > history
Vous pouvez passer la $HISTFILE
variable à votre script et cat
cela:
#!/bin/bash
cat "$1" > history
Enregistrez ce qui précède sous foo.sh
et exécutez comme ceci:
./foo.sh "$HISTORY"
Assurez-vous que la variable est exportée. Ajoutez cette ligne à vos fichiers ~/.bash_profile
(si elle existe) ou ~/.profile
(si elle ~/.bash_profile
n'existe pas):
export HISTFILE
Ensuite, déconnectez-vous et reconnectez-vous et vous devriez pouvoir exécuter à history > hist.txt
partir d'un script comme prévu. C'est parce que export VAR
signifie "rendre $ VAR disponible pour les shells enfants". Concrètement, cela signifie que la valeur de HISTFILE
sera héritée par le shell non interactif que vous utilisez pour exécuter votre script.
Maintenant, alors que le HISTFILE
sera défini, il n'a pas été lu par le shell exécutant le script. Donc, pour le faire fonctionner, vous devez d'abord le lire history -r
. Le script entier ressemblerait à ceci:
$!/bin/bash
history -r
history > hist.txt
Vous pouvez également l'exporter manuellement avant d'exécuter le script:
$ export HISTFILE
Mais vous en aurez toujours besoin history -r
dans le script.
Vous pouvez le source
faire comme suggéré par la réponse de @ p0llard .