GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Pourquoi ce script pour supprimer une partie de l'historique des commandes ne fonctionne-t-il pas sur l'ordinateur ?

Le script peut être trouvé ici :https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell

Pour plus de commodité, voici :

for x in `seq $1 $2`
do
  history -d $1
done

Je mets ceci dans mon répertoire include (celui que j'ai ajouté au PATH) où j'exécute de nombreux autres scripts que j'ai écrits et qui fonctionnent très bien.

Cela ne produit pas le résultat souhaité de suppression de lignes de mon historique, en fait cela ne fait rien du tout.

Avez-vous une idée de la raison pour laquelle la commande d'historique ne fonctionne pas ? Je me demande si cela a quelque chose à voir avec les répertoires.

Informations supplémentaires :

J'ai joué avec le code et essayé différentes variantes. Si je mets un echo devant l'history commande et l'exécuter, j'obtiens le résultat suivant :

[email protected]:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
[email protected]:~$ 

Donc, pour moi, il semble que cela devrait fonctionner parfaitement. Je n'arrive pas à comprendre pourquoi. Ce script est exécuté à partir de /$HOME/Scripts/ et il a été inclus dans le PATH. J'ai aussi essayé de l'exécuter avec sudo et rien ne change.

Réponse acceptée :

En une phrase :cela ne fonctionne pas parce que vous ne l'appelez pas correctement.

Tout d'abord, puisque votre script ne commence pas par #!/bin/bash , ce n'est pas vraiment un script bash. Le shell par lequel il est exécuté dépend de la façon dont vous l'invoquez. Lorsque vous l'invoquez à partir de la ligne de commande bash, bash crée une nouvelle instance de lui-même (cela doit de toute façon arriver pour exécuter n'importe quelle commande externe), et c'est cette nouvelle instance qui exécute le script. Ainsi, le script est exécuté avec les mêmes paramètres (y compris l'historique jusqu'à présent) que le shell parent. Il est exécuté avec différentes options; en particulier, le suivi de l'historique est désactivé pour les commandes du script (ce qui vous convient, car sinon cela rajouterait à l'historique que vous souhaitez modifier).

Si l'instance bash exécutant le script a le HISTFILE L'ensemble de variables dépend s'il a été exporté dans le parent (ce qui est un peu bizarre). S'il n'est pas exporté et donc défini dans l'enfant, le script enfant n'enregistrera pas l'historique modifié lorsqu'il se terminera.

Si HISTFILE est exporté, le script enfant modifiera votre fichier d'historique. Cependant, à moins que vous n'ayez configuré votre shell interactif pour recharger l'historique après chaque commande, l'historique modifié ne sera récupéré que par les instances nouvellement démarrées de bash.

Connexe :Double démarrage avec UEFI et LUKS – Que dois-je savoir/faire ?

Si vous souhaitez exécuter un extrait de shell qui affecte l'instance de shell actuelle, vous devez exécuter ce shell dans l'instance de shell actuelle, au lieu de l'exécuter en tant que sous-processus . Vous rencontreriez un problème similaire si vous vouliez faire d'autres choses qui affectent le processus shell lui-même, comme changer de répertoires, définir des variables, etc. Utilisez le . ("point") ou source builtin pour exécuter un script dans le processus shell actuel.

. idelhistory 300 365

Alternativement, vous pouvez définir cela comme une fonction dans votre .bashrc .


Ubuntu
  1. Comprendre le point d'exclamation (!) dans Bash ?

  2. L'historique des commandes semble manquer les 75 premières lignes ?

  3. Pourquoi Oracle Java n'est-il pas inclus dans le référentiel Ubuntu standard ?

  4. Commande d'historique montrant le répertoire et la date ?

  5. Pourquoi ce script exécutant Su ne semble-t-il jamais se terminer si je change d'utilisateur dans le script ?

Comment utiliser la commande Linux history

Comment afficher et supprimer l'historique du terminal dans Ubuntu 20.04

Comment utiliser la commande history sur CentOS 8

Trouver l'emplacement géographique du serveur Ubuntu via la ligne de commande

Pourquoi «boot-repair» est-il répertorié deux fois dans la documentation Ubuntu?

Pourquoi Ping -f agit-il comme ça ?