Puis-je rechercher l'historique dans bash et exécuter le résultat?
Puis-je rechercher l'historique dans bash et exécuter le résultat?
Réponses:
Tapez Ctrl Rsur la ligne de commande et commencez à taper la commande précédente. Une fois qu'un résultat apparaît, continuez à frapper Ctrl Rpour voir d'autres matches. Lorsque la commande souhaitée apparaît, appuyez simplement surEnter
Notez que while Ctrl Rest la valeur par défaut. Si vous souhaitez que la commande ( reverse-search-history
) soit liée, Ctrl Tvous pouvez configurer cela avec les éléments suivants:
bind '"\ Ct": recherche inversée historique'
Il existe toute une série d'autres commandes pouvant être lues par Readline qui sont également disponibles. Jetez un coup d’œil à la bash
page de manuel .
Bash dispose de nombreuses fonctionnalités pour rechercher et accéder à l'historique des commandes interactives. Le plus fondamental est le history
construit. Taper juste:
$ histoire
Imprimera une liste de commandes avec un index numérique, tel que:
$ histoire 1 clair 2 ls -al 3 vim ~ / somefile.txt 4 histoire $
Vous pouvez ensuite exécuter n'importe laquelle de ces commandes en utilisant leur index numérique en préfacant l'index par une seule !
, comme l'a souligné Mitch :
$! 1
Exécuter la clear
commande. L'historique intégré a de nombreuses fonctionnalités, vous pouvez en voir plus dans les pages man bash
et history
.
Vous pouvez également spécifier des compensations négatives relatives lorsque vous utilisez l' !
indicatif. Par conséquent, si vous souhaitez exécuter à vim
nouveau notre liste d'historique ci-dessus , vous pouvez:
$! -2
Ce qui consiste essentiellement à dire à bash d'exécuter 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 !!
(ce qui est un raccourci pour !-1
).
La !
désignation ne vous limite pas à spécifier numériquement la commande à exécuter. hayalci a montré que vous pouvez demander bash
à exécuter une commande en fonction du texte par lequel elle commence (en utilisant !
) ou du texte contenu dans la commande elle-même (en utilisant !?
). Encore une fois, en utilisant notre exemple d’historique ci-dessus, si nous voulons exécuter à clear
nouveau, il suffit de taper:
$! cl
et appuyez sur Enter. Et qu'en est-il vim
? C'est aussi simple que:
$!? some
Le point le plus important de la réponse de hayalci est l’appel à la commande shopt
intégrée:
$ shopt -s histverify
Cela permettra à la vérification de l' histoire afin que les commandes qui sont abondés par l' !
, !!
et !?
désignateurs ne sont pas aveuglément exécuté, mais rempli sur la ligne de commande afin de vous assurer qu'ils vont faire 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 .bashrc
fichier de démarrage afin qu'elle le soit chaque fois que vous vous connectez.
Comme cela a déjà été souligné, toutes ces informations peuvent être extraites de la bash
page de manuel . Pour le!, !!, et!? voir les indications de la section 9.3 Extension de l’historique .
shopt
va dans bashrc, pas bash_profile (ou il ne sera pas activé pour les shells qui ne sont pas des shells de login).
Au lieu de cela 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 de telle sorte qu'après toute action de l'historique (comme !!:s/prev_text/after_text
), il place la ligne résultante à l'invite de commande. Ensuite, vous pouvez revoir ou éditer la commande et appuyer sur Entrée ensuite.
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 d’ appuyer sur la touche de recherche, au lieu d’appuyer d’abord sur la touche de recherche, puis de saisir la chaîne de recherche.
Par défaut, sur mon système, Mp et Mn 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
HISTIGNORE
.
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 tout en modifiant un mot. Supposons que vous avez tapé le nom du répertoire ou que vous vouliez changer le nom du fichier:
$ echo mon nom est bob je m'appelle Bob $ ^ bob ^ jordan echo mon nom est jordan Mon nom est 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 pensait bash.
La navigation dans l'historique à l'aide de la combinaison de touches Ctrl-r étant fastidieuse pour l'OMI, vous pouvez envisager hh :
https://github.com/dvorka/hstr
ce qui rend la navigation beaucoup plus simple, simple et efficace, notamment en exécutant la commande:
ctrl + r
par défaut maintenant
À l'invite de commande bash, tapez control-R, puis tapez quelques caractères de la commande souhaitée. La fonction readline de bash recherchera cette commande dans l'historique des commandes.
Une fois la recherche lancée, vous pouvez taper à nouveau control-R pour passer à la commande correspondante suivante.
Si votre shell est configuré pour utiliser des vi
raccourcis clavier ( set -o vi
ou avoir set editing-mode vi
dans $HOME/.inputrc
), vous 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.
J'aime HSTR mais je n'arrive pas toujours à l'installer. J'ai donc écrit un alias en utilisant fzf qui imite son comportement ( hx
pour "history execute")
alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
history
: bien, obtenez l'histoiresed
: supprimer la colonne de numéro de la liste (POSIX)fzf
: voici la magie, vous permet d'effectuer une recherche fuzzy de manière interactive dans la liste ou de vous déplacer avec C-J
et C-K
puis d'exécuter une commande avec Enter
.--height
: définit le nombre de lignes affichées.--tac
: rétablir la liste (plus logique pour un historique)--tiebreak=index
: conserve l'ordre de l'historique lorsque fzf met à jour les résultats