web-dev-qa-db-fra.com

Utilisation de l'historique bash pour obtenir une commande précédente, copiez-la puis exécutez-la mais avec la commande commentée

Juste une question pour améliorer mes compétences bash. Je fais toujours ça:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

Je peux alors exécuter la commande que j'ai trouvée en faisant:

!123

Cependant, je veux souvent faire ceci:

some_long_command1foobar

C'est à dire. changez la commande avant de l'exécuter. Pouvez-vous utiliser bash pour exécuter cette commande à la place:

#some_long_command1

alors il est commenté.

Ensuite, je n'ai pas besoin d'utiliser ma souris pour mettre la commande en surbrillance, la modifier puis la lancer (je peux simplement utiliser le clavier - plus rapidement).

Je suppose que je pourrais écrire un script pour le faire mais il y a peut-être déjà des fonctionnalités intégrées quelque part ...?

Je vous remercie.

77
ale

Au lieu d'utiliser la commande history, je vous suggérerais d'utiliser ctrl+r et de commencer à taper cette commande. Lorsque vous appuyez sur une touche fléchée comme si vous vouliez la modifier, la reconnaissance de la saisie semi-automatique ne serait plus reconnue et vous permettrait de la modifier avant de la lancer.

UPDATE: si vous souhaitez parcourir les différentes commandes contenant la chaîne que vous venez de taper, continuez d'appuyer sur ctrl+r

137
Miquel

En fait, vous pouvez simplement ajouter :p à la commande pour l’imprimer sans le lancer. Par exemple:

$ ls -la
$ !!:p

Imprime ls -la comme commande précédente sans l'exécuter. Vous pouvez simplement appuyer sur  (en haut) pour le trouver et le modifier.

Vous pouvez aussi faire

!123:p

pour imprimer la 123ème commande en tant que votre précédente commande.

58
joeschmidt45

Vous pouvez également essayer la commande fc pour modifier la commande dans l'historique.

WIKI dit,

fc est un programme standard sous Unix qui répertorie, édite et réexécute les commandes précédemment entrées dans un shell interactif. fc est un intégré commande dans la bash Shell; help fc affichera des informations d'utilisation.


En dehors de recherche incrémentielle inverse (Ctrl+R), nous avons quelques autres bash raccourcis:

De man bash:

antécédents (C-p)
 Récupère la commande précédente de la liste de l'historique, en revenant dans la liste. 
histoire suivante (C-n)
 Récupère la commande suivante de la liste d’historique, puis avance dans la liste. 
début de l'histoire (M- <)
 Aller à la première ligne de l'historique. 
fin de l'histoire (M->)
 Aller à la fin de l’historique de saisie, c’est-à-dire la ligne en cours de saisie. 
recherche inversée historique (C-r)
 Effectuez une recherche en arrière en commençant par la ligne actuelle et en remontant dans l'historique, si nécessaire. Ceci est une recherche incrémentale. 
historique de la recherche avancée (C-s)
 Recherche en commençant par la ligne courante et en descendant dans l’historique si nécessaire. Ceci est une recherche incrémentale. 
historique de recherche inversée non incrémental (M-p)
 Recherche en arrière dans l’historique en commençant à la ligne actuelle en utilisant une recherche non incrémentielle d’une chaîne fournie par l’utilisateur. 
historique non incrémental de recherche en aval (M-n)
 Effectuez une recherche avant dans l'historique à l'aide d'une recherche non incrémentielle d'une chaîne fournie par l'utilisateur. 
yank-nth-arg (M-C-y)
 Insère le premier argument de la commande précédente (généralement le deuxième mot de la ligne précédente) au point. Avec un argument n, insérez le nième mot de la commande précédente (les mots de la commande précédente commencent par Word 0). Un argument négatif insère le nième mot à partir de la fin de la commande précédente. Une fois que l'argument n est calculé, l'argument est extrait comme si l'extension "! N" de l'historique avait été spécifiée. 
yank-last-arg (M-., M-_)
 Insère le dernier argument de la commande précédente (le dernier mot de l’entrée de l’historique précédente). Avec un argument, se comporter exactement comme yank-nth-arg. Les appels successifs à yank-last-arg reviennent dans l'historique en insérant tour à tour le dernier argument de chaque ligne. Les installations d’extension d’historique sont utilisées pour extraire le dernier argument, comme si l’extension d’historique "! $" Avait été spécifiée. 
Shell-expand-line (M-C-e)
 Développez la ligne comme le fait le shell. Cela permet de développer les alias et l'historique ainsi que toutes les extensions du Shell Word. Voir EXPANSION D'HISTORIQUE ci-dessous pour une description de l'expansion de l'historique. 
histoire-expand-line (M- ^)
 Développe l’historique de la ligne en cours. Voir EXPANSION D'HISTORIQUE ci-dessous pour une description de l'expansion de l'historique. 
insert-last-argument (M-., M-_)
 Synonyme de yank-last-arg. 
operer et etre suivant (C-o)
 Acceptez la ligne en cours d’exécution et récupérez la ligne suivante par rapport à la ligne en cours de l’historique pour la modifier. Tout argument est ignoré. 
commande edit-and-execute (C-xC-e)
 Invoque un éditeur sur la ligne de commande en cours et exécute le résultat en tant que commande Shell.
18
Prince John Wesley
!123:gs/old/new/

Lance la commande 123 en remplaçant la chaîne 'old' par la chaîne 'new'.

10
John Lawrence

Vous pouvez accéder au mode édition en appuyant sur M- ^ (option-shift-6 sur un mac).

Tapez ceci:

! 123M- ^

Et vous modifierez la commande n ° 123. C'est un peu comme utiliser ctrl-r, mais en commençant par la syntaxe du point d'exclamation.

5
James Moore

Vous pouvez aussi mettre

shopt -s histverify

dans votre .bash_profile, ce qui entraîne l’extension de l’historique sur votre ligne de commande sans l’exécuter, vous permettant ainsi d’éditer avant de le faire 

3
chepner

Au lieu d'utiliser la commande history, liez history-search-backward/history-search-forward à des raccourcis clavier faciles à mémoriser (je préfère PgUp/PgDown). Pour ce faire, mettez ceci dans votre fichier .inputrc:

"<key code>":  history-search-backward
"<key code>":  history-search-forward

Pour obtenir <key code>, tapez Ctrl-V <key> dans le shell et remplacez le ^[ de départ par \e dans le résultat.

Une fois que cela est configuré, vous pouvez simplement taper some et appuyer sur PgUp pour obtenir some_long_command. Si vous avez besoin de some_long_command with_some_arg mais qu'il y ait une commande similaire some_long_command with_some_other_arg plus tard dans l'historique, vous pouvez passer en revue jusqu'à ce que vous l'ayez atteinte en tapant some, puis en appuyant plusieurs fois sur PgUp, ou vous pouvez taper some, appuyer sur PgUp, déplacer le curseur à l'endroit où les deux commandes commencez à différer, tapez quelques caractères et appuyez une nouvelle fois sur PgUp. Cette capacité à parcourir/différencier rapidement des commandes similaires en fait, à mon avis, un outil beaucoup plus confortable que Ctrl-R.

3
Tgr

Vous pouvez essayer d’essayer un historique de type "suggérer une boîte" https://github.com/dvorka/hstr - il lit l’historique Bash et permet une navigation rapide.

hh

Pour obtenir la dernière commande, tapez simplement hh, naviguez jusqu'à la commande et utilisez la flèche vers la droite pour l'obtenir en ligne de commande (où vous pouvez l'éditer et/ou ajouter un commentaire).

1
Martin Dvorak

^ p pour obtenir la dernière commande tapée dans unix/solaris

0
SudhakarM

Mettre

alias r = 'fc -s'

dans votre .bashrc (répertoire personnel) alors vous pouvez simplement taper

r <whatever>

à l'invite de commande et vous exécuterez une copie de la dernière commande <whatever> (mêmes paramètres) figurant dans votre historique. Il suffit de taper la flèche pour voir ce que vous avez exécuté si vous en ressentez le besoin.

0
chuck