Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2013, à 13:14

Latsuj

Update de .bash_history à partir d'un script

Bonjour,

Une question concernant le fichier de l'historique (.bash_history), je cherche à le mettre à jour à partir d'un script shell. Comme vous le savez sûrement, le fichier de l'historique des commandes ne se met à jour que lorsque vous quitter le terminal.
On peux bien sur forcer l'enregistrement à chaque commande :

export PROMPT_COMMAND='history -a'

Mais je cherche à faire la même chose sans utiliser de commande dans mon terminal. Pour résumer, je cherche à update mon historique de commande à partir d'un script shell pour récupérer la dernière commande tapé dans le terminal où est lancé le script.

Auriez-vous une idée ?

Merci d'avance d'avoir pris la peine de lire.
Latsuj

Dernière modification par Latsuj (Le 27/01/2013, à 13:21)

Hors ligne

#2 Le 27/01/2013, à 14:36

tiramiseb

Re : Update de .bash_history à partir d'un script

Une fois dans ton terminal, c'est un sous-shell qui est lancé. Du coup tu n'es plus dans le même shell. Du coup tu ne peux pas faire ça.
Enfin je crois.

Quel est ton besoin sous-jascent, qu'essaies-tu de faire ?

Hors ligne

#3 Le 27/01/2013, à 14:45

Latsuj

Re : Update de .bash_history à partir d'un script

Bonjour,

J'essaye de récupérer la dernière commande lancé afin de la modifié suivant mes envies par la suite. Mais pour cela, il faut que je sache qu'elle est la commande lancé juste au dessus de l’exécution de mon script et je bloque à cet endroit.
Je souhaitais le faire via l'historique du shell mais celui-ci ne s'update qu'après la fermeture du shell et non après l’exécution d'une commande. Si tu/vous as/avez un autre moyen de récupérer la commande lancé avant le script, je suis preneur. 

Bonne journée.

Hors ligne

#4 Le 27/01/2013, à 14:55

tiramiseb

Re : Update de .bash_history à partir d'un script

Le seul moyen que je vois est de *donner* cette commande à ton script.

Bash remplace "!!" par l'intégralité de la ligne précédente, alors si tu tapes « ./le_script.sh "!!" » il recevra, comme premier argument, la ligne précédente.
Mais bon ce n'est pas vraiment automatique, ça ne me semble pas correspondre à ce que tu veux.

Et comme je te l'ai dit, quand tu lances un script ça démarre un nouveau shell (indépendant), qui ne pourra pas agir sur celui à partir duquel tu as lancé le script.

Je crois que tu es dans une impasse. Sauf si quelqu'un d'autre a une idée, mais moi là je sèche.


Dans la mesure où tu ne veux pas nous dire précisément ce que tu veux faire avec cette précédente commande, on ne peut pas essayer de trouver une solution alternative.

Hors ligne

#5 Le 27/01/2013, à 17:57

Latsuj

Re : Update de .bash_history à partir d'un script

Bonjour,

C'est un script sans intérêt que j'essaye de faire, juste pour voir si j'en étais capable. Apparemment non.
Le but voulu est d'annuler la commande précédente si c'est une commande affectant des fichiers ou répertoires, exemple avec un move, cp...ext
Et faire ceci à partir d'un script, pas une commande particulière.

Mais pour réaliser ceci, je suis obligé de récupérer d'une manière ou d'une autre la commande précédente.

Je pensais utiliser dans un premier temps, les commandes !-n, mais l'historique ne marche pas dans les scripts shell. J'ai cherché à le faire autrement.
Et je pensais alors utiliser le fichier .bash_history. Encore une fois, je suis bloqué. Je ne sais pas si il est possible d'update le fichier history à partir d'un script.
Mais tu as raison, à partir du moment où je lance la commande dans le shell courant, j'ouvre un sous-shell et je suis bloqué sur l'autre...J'y pensais mais peut-etre y avait-il un moyen de faire que je ne connaissais pas encore.

Merci pour tes réponses.
J'abandonne pas, je continue à chercher. Si quelqu'un a une idée, je suis preneur.
Bonne journée.

Hors ligne

#6 Le 27/01/2013, à 18:00

Haleth

Re : Update de .bash_history à partir d'un script

Ben, j'pense que !! est une solution


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#7 Le 27/01/2013, à 18:09

tiramiseb

Re : Update de .bash_history à partir d'un script

Haleth: si on le tape dans le shell courant oui, mais ça ne marchera pas en mettant "!!" dans le script...

Hors ligne

#8 Le 27/01/2013, à 18:25

pingouinux

Re : Update de .bash_history à partir d'un script

Bonjour,
Peut-être comme ceci :
Si tu lances ton script ainsi

history -a; ./mon_script

l'avant-dernière ligne de ~/.bash_history contiendra la commande précédente.

Dernière modification par pingouinux (Le 27/01/2013, à 18:27)

Hors ligne

#9 Le 27/01/2013, à 18:29

tiramiseb

Re : Update de .bash_history à partir d'un script

pingouinux: ou aussi

./mon_script !!

smile

(en adaptant le script pour qu'il puisse lire son premier argument bien sûr)
Ça simplifierait le script en question je pense.

Dernière modification par tiramiseb (Le 27/01/2013, à 18:29)

Hors ligne

#10 Le 27/01/2013, à 18:40

pingouinux

Re : Update de .bash_history à partir d'un script

@tiramiseb : J'avais fait des essais dans ce sens, mais je n'ai pas réussi à récupérer simplement les arguments de la commande s'ils contiennent des espaces

Hors ligne

#11 Le 27/01/2013, à 18:46

tiramiseb

Re : Update de .bash_history à partir d'un script

Et

./mon_script "!!"

?

(c'est pas à toi que je vais apprendre l'usage des guillemets, quand même tongue )

Dernière modification par tiramiseb (Le 27/01/2013, à 18:47)

Hors ligne

#12 Le 27/01/2013, à 18:58

pingouinux

Re : Update de .bash_history à partir d'un script

Si c'est juste pour relancer la même commande, ça va

$ cat mon_script
"$@"
$ echo "aaa    bbb"   "ccc  ddd"
aaa    bbb ccc  ddd

$ ./mon_script !!
./mon_script echo "aaa    bbb"   "ccc  ddd"
aaa    bbb ccc  ddd

Hors ligne

#13 Le 27/01/2013, à 18:59

Latsuj

Re : Update de .bash_history à partir d'un script

Bonsoir,

Vos idées sont bonnes et je vous les auraient sûrement empreinté. Mais je souhaite me limiter à un script, d'où un lancement du script basic :

./mon_script
bash ./mon_script

C'est peut être impossible ce que je souhaite faire, n'étant pas un expert dans ce domaine. hmm

Ta solution pingouinux est celle que je pensais faire, mais je veux pas le faire à l'appel. C'est pour cela que je voulais export (premier post) mais encore une fois, j'ai un problème...

Non, je vois pas comment faire. Impossible peut-être ?

Merci de vos réponses.
Bonne soirée.

Dernière modification par Latsuj (Le 27/01/2013, à 19:00)

Hors ligne

#14 Le 27/01/2013, à 19:01

tiramiseb

Re : Update de .bash_history à partir d'un script

Pour moi c'est impossible...

Hors ligne

#15 Le 03/02/2013, à 17:07

m@z3

Re : Update de .bash_history à partir d'un script

Salut smile .
A croire qu'on a le même problème hum ; ).
J'ai pensé à la meme chose que toi (update du .bash_history), et j'ai été confonté à la même impasse.

Bref, une solution possible est d'appeler ton script comme ça ;

. mon_script

Ainsi la commande history fait le boulot.
Ceci dit, je ne comprends pas pourquoi. Si quelqu'un peut m'éclairer...

En lançant le script de cette manière, on peut récupérer la derniere commande tapée dans le shell courant avec un truc comme ça par exemple :

history > /tmp/historytmp;
let "nblines=`cat /tmp/historytmp | wc -l`";
let "nblines = $nblines - 1"; #la derniere commande etant ". mon_script"
cmd=`grep "$nblines" /tmp/historytmp`

Dernière modification par m@z3 (Le 03/02/2013, à 17:12)

Hors ligne

#16 Le 03/02/2013, à 17:11

tiramiseb

Re : Update de .bash_history à partir d'un script

Bref, une solution possible est d'appeler ton script comme ça ;

. mon_script

Ainsi la commande history fait le boulot.
Ceci dit, je ne comprends pas pourquoi. Si quelqu'un peut m'éclairer...

Parce que là tu n'"exécute" pas le script.

Tu importes le contenu du script dans la session actuelle.

(par exemple, toute variable configurée dans le script restera disponible après son import par ".")

En lançant le script de cette manière, on peut récupérer la derniere commande tapée dans le shell courant avec un truc comme ça par exemple :

history > /tmp/historytmp;
let "nblines=`cat /tmp/historytmp | wc -l`";
let "nblines = $nblines - 1"; #la derniere commande etant ". undo"
cmd=`grep "$nblines" /tmp/historytmp`

Ou encore :

history | tail -2 | head -1

Hors ligne