Puis-je rechercher l'historique dans bash et exécuter le résultat?
Type CtrlR sur la ligne de commande et commencez à taper la commande précédente. Une fois qu'un résultat apparaît continue de frapper CtrlR pour voir d'autres allumettes. Lorsque la commande souhaitée apparaît, appuyez simplement sur Enter
Notez que tandis que CtrlR est la valeur par défaut si vous voulez que la commande (reverse-search-history
) soit liée à CtrlT vous pouvez configurer cela avec ce qui suit:
bind '"\ C-t": historique de la recherche inversée'
De nombreuses autres commandes lisibles readline sont également disponibles. Jetez un coup d’œil à la page de manuel bash
NAME_ .
Bash dispose de nombreuses fonctionnalités pour rechercher et accéder à l'historique des commandes interactives. Le plus fondamental est le nom intégré history
name__. Taper juste:
$ histoire
Imprimera une liste de commandes avec un index numérique, tel que:
$ history 1 clear 2 ls -al 3 vim ~/quelquefichier.txt 4 historique $
Vous pouvez ensuite exécuter n'importe laquelle de ces commandes en utilisant leur index numérique en préfacant l'index avec un seul !
, comme Mitch a souligné:
$! 1
Exécute la commande clear
name__. L'historique intégré a de nombreuses fonctionnalités, vous pouvez en voir plus dans les pages de manuel bash
et history
name__.
Vous pouvez également spécifier des compensations négatives relatives lorsque vous utilisez l'indicateur !
. Ainsi, en utilisant notre liste d'historique ci-dessus, si nous voulions exécuter à nouveau vim
name__, nous pourrions faire:
$! -2
Ce qui signifie fondamentalement que bash exécute la commande que vous avez exécutée "il y a deux commandes". Pour exécuter la commande précédente dans la liste de l'historique, nous pouvons simplement utiliser !!
(qui est simplement un raccourci pour !-1
).
L'indicateur !
ne vous limite pas à spécifier numériquement la commande à exécuter. hayalci a montré que vous pouvez demander à bash
d'exécuter une commande en fonction du texte par lequel elle commence (en utilisant !
) ou du texte de la commande elle-même (en utilisant !?
). Encore une fois, en utilisant notre exemple d’historique ci-dessus, si nous voulions exécuter à nouveau clear
name__, il nous suffirait de taper:
$! cl
et appuyez sur Enter. Et que dire de vim
name__? C'est aussi simple que:
$!? quelque
Le point le plus important de la réponse de hayalci est l'appel à la variable shopt
name__:
$ shopt -s histverify
Cela activera la vérification de l'historique afin que les commandes associées aux indicateurs !
, !!
et !?
ne soient pas exécutées à l'aveuglette, mais complétées sur la ligne de commande afin de vous assurer qu'elles ne feront aucun mal avant de les exécuter. Ceci est encore plus important lorsque vous exécutez des commandes en tant qu'utilisateur root. Cette option peut être définie dans votre fichier de démarrage .bashrc
de sorte qu'elle soit définie à chaque fois que vous vous connectez.
Comme il a déjà été souligné, toutes ces informations peuvent être extraites de la page de manuel bash
NAME_ . Pour le!, !!, et!? voir les indications de la section 9.3 Extension de l’historique .
Comme alternative à crtl+R, vous pouvez rechercher l’historique en tapant
!text
Ceci recherchera dans l'historique la commande la plus récente commençant par 'text'.
Mais je vous suggère de mettre cela dans votre .bashrc pour empêcher l'exécution d'une mauvaise commande.
shopt -s histverify
Ceci indique à bash que, après toutes les actions historiques (comme !!:s/prev_text/after_text
), il place la ligne résultante dans la commande Invite. Ensuite, vous pouvez revoir ou éditer la commande et appuyer ensuite sur Entrée.
Vous pouvez aussi faire:
history | grep "stuff"
il retournerait quelque chose comme
num stuff
alors vous pouvez taper
!num
Je préfère utiliser l'historique-recherche-arrière sur l'historique de recherche inversée. Le premier vous permet de saisir quelques caractères de la commande puis et d’appuyer sur la touche de recherche au lieu d’appuyer d’abord sur la touche de recherche puis de taper la chaîne de recherche.
Par défaut, sur mon système, M-p et M-n se lient à des fonctions similaires, mais je préfère lier les touches de direction:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
J'ai un très bon alias, h. C'est vraiment juste "history | grep", mais je filtre les entrées précédentes de "commande h" avec "grep -E -v"
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
utilisé comme
h aliases
2003 less .bash_aliases
Excellent article, Sean! Je mettrais cela dans un commentaire, mais je suis timide sur quelques points de réputation. :-)
Une autre technique connexe et utile est la possibilité d’exécuter une commande précédente en modifiant un mot. Supposons que vous avez tapé le nom du répertoire ou que vous vouliez changer le nom du fichier:
$ echo je m'appelle bob mon nom est bob $ ^ bob ^ jordan echo je m'appelle jordan je m'appelle jordan
Notez que la commande est développée, remplacée et sortie avant son exécution. Ainsi, si vous exécutez la mauvaise commande, vous pouvez voir ce que bash pensait en faire.
La navigation dans l'historique à l'aide de la combinaison de touches Ctrl-r étant fastidieuse pour l'OMI, vous pouvez envisager de considérer hh:
https://github.com/dvorka/hstr
ce qui rend la navigation beaucoup plus simple, simple et efficace - y compris en exécutant la commande:
À l'invite de commande bash, tapez control-R, puis tapez quelques caractères de la commande souhaitée et la fonction readline de bash effectuera une recherche dans l'historique de commande pour cette commande.
Après avoir lancé la recherche, vous pouvez taper à nouveau control-R pour passer à la commande correspondante suivante.
Si votre Shell est configuré pour utiliser les raccourcis clavier vi
(set -o vi
ou set editing-mode vi
dans $HOME/.inputrc
), effectuez une recherche avec <Esc>/some-command<Return>
et cliquez sur n
(suivant) ou Shift-n
(précédent) pour parcourir l'historique de la ligne de commande.
CTRL+R fonctionne très bien, comme @ John1024 l’a suggéré, mais est un peu fastidieux si bon nombre de vos commandes récentes sont similaires et que vous souhaitez un moyen rapide de toutes les analyser. Une alternative serait d'utiliser history
:
$ history | grep keyword