Bash: rappeler une commande connue de l'historique

Bonjour,

Je suis à peu près sûr qu’on peut faire ça facilement : j’ai déjà vu quelque chose à ce propos mais je n’arrive pas à retrouver l’info… :blush:

Je voudrais pouvoir rappeler facilement une commande de mon historique shell (bash) sachant que je la connais par cœur mais que j’ai la flemme de la retaper. Cette commande peut être rendue assez loin dans l’historique en fonction de ce que j’ai fait entre temps, donc les flèches haut/bas ne sont pas vraiment appropriées dans ce cas.

En fait ce que je cherche c’est un peu comme l’auto-complétion de bash, mais à partir de son historique et non pas des commandes disponibles dans mon PATH…

Une idée ?

Edit : il me semblait bien que c’était quelque chose de simple, du coup j’ai essayé un peu au pif tous les Ctrl+touche dans une console bash (même pas peur), et j’ai trouvé : [size=125]Ctrl+R[/size] :smiley:
Désolé pour le dérangement… :wink:

Hello,

Ce que je fais personnellement c’est :
history |grep machin_truc

Enfin tu remplaces machin_truc par un morceau de ta commande

Déjà ça te ramène un historique avec uniquement les commandes qui t’intéressent

ensuite imaginons que celle que tu veux est précédée du chiffre 485
tu fais
!485
et ça la lancera.

J’espère que ça t’aidera.

Leank:)

[quote=“Leank”]Ce que je fais personnellement c’est :
history |grep machin_truc

Enfin tu remplaces machin_truc par un morceau de ta commande

Déjà ça te ramène un historique avec uniquement les commandes qui t’intéressent

ensuite imaginons que celle que tu veux est précédée du chiffre 485
tu fais
!485
et ça la lancera.[/quote]
Pas mal aussi ça, c’est toujours bon à savoir…
D’ailleurs je m’étais toujours demandé pourquoi bash gueulait quand je lui mettais un ! sans guillemets autour dans une ligne de commandes… maintenant je sais. :smiley:
Merci pour l’info. Le Ctrl+R reste plus pratique dans le cas qui m’intéresse, mais pour les recherches ambiguës (plusieurs lignes de commandes relativement semblables) ta méthode semble mieux, car le Ctrl+R ne semble pas permettre de naviguer dans les différentes possibilités, il offre juste la plus récente correspondant à la recherche effectuée.

[quote=“syam”][…]Le Ctrl+R reste plus pratique dans le cas qui m’intéresse, mais pour les recherches ambiguës (plusieurs lignes de commandes relativement semblables) ta méthode semble mieux, car le Ctrl+R ne semble pas permettre de naviguer dans les différentes possibilités, il offre juste la plus récente correspondant à la recherche effectuée.[/quote]Sauf erreur de ma part, en appuyant une nouvelle fois sur Ctrl+R il recherche la correspondance précédente.

LeDub qui, après 12 ans d’Unix/Linux, a découvert Ctrl+R il y a peine 1 an !!!

Salut,

Un complément s’impose … :083

quote=“Bash”

Réutilisation de commandes avec substitution
Pour ré-exécuter la commande précédente en changeant quelques paramètres, utilisez l’history expansion de Bash :

shell:~$ !!:gs/ancienparamètre/nouveauparamètre/

L’history expansion de Bash est très puissante, et la section du man qui la documente est à cette image : copieuse. Pour la petite histoire, !! signifie qu’on réfère à la ligne d’historique précédente — c’est à dire, la ligne de commande exécutée juste avant —, :g signifie qu’on applique la substitution à toute la ligne de commande (par défaut, seul la première occurrence est substituée) et enfin le mondialement connu s/foo/bar/ qui demande la substitution de “foo” par “bar”.

Réutiliser certains paramètres de lignes de commande antérieures
Dans le même registre que l’astuce précédente il est possible de réutiliser uniquement certains paramètres de commandes précédemment exécutées, toujours grâce à la fonctionnalité d’history expansion. ‘‘Démonstration attention’’ :

shell:~$ mkdir a b c d
shell:~$ rmdir !:2-3 <= on réutilise uniquement le 2ème et 3ème paramètre de la commande précédente, soit “b” et "c"
rmdir b c
shell:~$ ls
a d
shell:~$

Là encore, je vous renvoie vers le man de Bash, section “HISTORY EXPANSION” pour une référence exhaustive de la syntaxe.

Logger (élégamment) les messages d’erreur d’un script Bash
Bien qu’il soit possible de rediriger les messages d’erreur au moment de l’exécution d’un script (du genre script.sh 2>erreurs.log par exemple), il est possible de faire cela plus proprement depuis le script :

#!/bin/bash
exec 3>/tmp/monscript-erreurs.log
exec 2>&3


exit 0

Basiquement, on déclare un descripteur de fichier supplémentaire qui pointe vers un fichier /tmp/monscript-erreurs.log et on redirige la sortie STDERR vers ce nouveau descripteur.

(…)
[/quote]

Ooooh… cool ça ! :smiley: (je viens de tester, effectivement ça marche)

[quote=“loreleil.747”]Un complément s’impose … :083
[…][/quote]
Ça a l’air bien puissant tout ça. Reste plus qu’à essayer de le retenir… :mrgreen:
Merci. :wink:

Sans avoir taper Ctrl +R …

[code]:~$ history
(…)

369 25/10/2011 15:53:43 wget http://checkip.dyndns.com/ -q -O - | sed 's/^.Address: ([0-9].[0-9].[0-9].[0-9])<./\1/'g

(…)

loreleil@machine1:~$ !369
wget http://checkip.dyndns.com/ -q -O - | sed 's/^.Address: ([0-9].[0-9].[0-9].[0-9])<./\1/'g
xxx.xxx.xxx.xxx
loreleil@machine1:~$

[/code]