web-dev-qa-db-fra.com

Commande d'histoire à l'intérieur de Bash Script

L'histoire est une commande intégrée à la coquille, je ne pouvais pas l'utiliser dans un script Bash. Alors, y a-t-il un moyen d'atteindre cet utilisation de Bash Script?
[.____] ici, nous allons mon script pour vous:

#!/bin/bash
history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]
20
Vijay Ramachandran

Bash désactive l'historique des obus non interactifs par défaut, mais vous pouvez l'allumer.

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …

Mais si vous essayez de surveiller l'activité sur ce serveur, l'historique de Shell est inutile (il est trivial pour exécuter des commandes qui ne figurent pas dans l'historique). Voir Comment puis-je enregistrer tous les lancements de processus sous Linux .

Si vous déboguez un script, l'historique de Shell n'est pas le meilleur moyen d'obtenir des informations utiles. Un outil de trace de débogage est bien meilleur: mettre set -x près du sommet du script. La trace est écrite sur une erreur standard.

Je ne sais pas si cela utilise effectivement la capacité d'historique lorsqu'il est exécuté de manière non interactive, sinon chaque script shell que vous exécutez encombrerait votre historique de commande.

Pourquoi ne pas aller directement à la source ${HOME}/.bash_history, remplacer history | tail -100 avec tail -100 ${HOME}/.bash_history. (Si vous utilisez des horodatages, vous devrez probablement faire quelque chose dans le sens de grep -v ^# ${HOME}/.bash_history | tail -100).

6
Kjetil Jorgensen

Si vous souhaitez utiliser la sortie de la commande history à partir d'une session Shell active dans un script, vous pouvez utiliser un alias pour exécuter la commande d'abord. Ensuite, dans le même alias, vous pouvez appeler le reste du script. Avec une telle configuration, vous pouvez obtenir essentiellement le même résultat que la commande history dans le script actuel.

Par exemple, vous pouvez créer un alias comme celui-ci, en supposant que le nom du script est le script.sh:

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

Et changer le script à ceci:

#!/bin/bash
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" [email protected]

J'ai trouvé cette question en écrivant un processus pour combiner, trier et synchroniser ~/bash_history Fichiers sur deux ordinateurs afin que ce soit facile à rechercher des commandes que j'ai utilisées dans le passé.

Il est beaucoup moins lourd de mettre à jour mon fichier d'historique cumulatif sans avoir à se connecter à une nouvelle coquille pour avoir ~/bash_history mis à jour. Pour surveiller un serveur, cela ne fonctionnera évidemment pas, comme indiqué dans les autres réponses.

Mon utilisation en particulier est la suivante:

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

Le script hby.sh Tirez ensuite toutes les entrées uniques de tout ~/.bash_history* des dossiers.

2
clk

La commande Historique est désactivée par défaut sur Bash Script, c'est pourquoi même la commande historique ne fonctionnera pas dans le fichier .sh. Pour sa redirection, veuillez rediriger le fichier Bash_History dans le fichier .sh.

ou le mécanisme d'histoire peut également être activé en mentionnant le fichier d'historique et modifier les paramètres de temps d'exécution comme mentionné ci-dessous.

#!/bin/bash
HISTFILE=~/.bash_history
set -o history 

remarque: mentionné ci-dessus deux lignes en haut du fichier de script. Maintenant, la commande d'histoire fonctionnera dans l'histoire.

1
linux.cnf

Créer un script nommé script.sh comme ci-dessous. Il crée un script nommé x et met y nombre de lignes de votre historique.

#!/bin/bash
SCRIPT_NAME=$1
NUMBER_OF_LINES_BACK=$2

# Enable History in a non interactive Shell
HISTFILE=~/.bash_history
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;
~

Ensuite, si vous souhaitez créer un script vers un accomplissement d'une tâche nommée "tâche" que vous avez travaillé pour les 14 dernières lignes.

script.sh task 14

Puis nettoyez votre histoire pour faire un joli script!

1
Eric