Sélectionnez les commandes de l'historique bash

20

Appuyer sur le bouton haut est fastidieux et je risque de manquer la commande que je cherchais. Ainsi, lorsque historyje tape sur le terminal, je reçois toutes les commandes que j'ai entrées auparavant, indexées sur un nombre. Existe-t-il un moyen d'appeler le numéro associé à la commande?

user182936
la source
une option plus interactive maintenant? ce sont tellement sujets aux erreurs
mat

Réponses:

31

L'histoire de bash peut faire beaucoup de choses utiles, et la recherche avec Strg-rlaquelle Terry Wang a mentionné est importante parmi elles. Mais il est également possible de faire exactement ce que vous avez demandé.

Vous pouvez refaire la commande précédente avec !!. Avec cela, vous pouvez également modifier la commande précédente. Si, par exemple, vous avez oublié d'obtenir les privilèges root pour une commande

apt-get install a-long-list-of-packages

vous n'avez pas besoin de retaper tout cela à nouveau. Appelez plutôt

sudo !!

Si vous souhaitez réexécuter la commande à un emplacement spécifique de votre historique, vous pouvez également utiliser !, par exemple

!3

pour réexécuter la commande en position 3. Sachez que cela compte à partir du haut. Donc, si vous stockez 500 commandes dans votre historique, ce !1serait "500 commandes auparavant". Vous pouvez également utiliser des nombres négatifs. Par exemple

!-2

ré-exécuterait l'avant-dernière commande.

Vous pouvez également réexécuter la dernière commande qui a commencé avec une chaîne comme

!apt-

qui refait la dernière ligne commençant par "apt-". Si vous voulez que la dernière commande où la chaîne apparaisse n'importe où dans la ligne, vous pouvez utiliser quelque chose comme

!?pt-ge

Il y a des choses plus intéressantes que l'histoire de bash peut faire. Juste pour donner une impression du large éventail de possibilités, vous pouvez spécifiquement accéder à un paramètre d'une commande de l'historique. Donc

!-5:3:p

imprimerait le troisième paramètre au cinquième de la dernière commande.

EDIT: Concernant le commentaire de Rudie ci-dessous, avec les paramètres standard, ces extensions d'historique bash sont en effet exécutées directement. Il est probablement mieux décrit comme ceci: un appel comme !-3est remplacé par le shell avec l'avant-dernière commande de votre historique, puis votre entrée (avec le remplacement) exécutée. Donc, si vous tapez !-3et appuyez sur ENTERet que votre troisième dernière commande était ls ~, c'est en fait la même chose que si vous avez tapé à ls ~nouveau et appuyé ENTERsur "par vous-même".

Si vous ne le souhaitez pas, vous pouvez définir l'option shell histverify. Pour définir et désactiver les options du shell, vous souhaiterez peut-être lire la shoptcommande. Avec histverifyset, un appel comme !-3écrit uniquement le remplacement de votre historique sur votre ligne de commande, mais ne l'exécute pas directement. Vous avez donc, pour parler, appuyez sur le crucial ENTERvous-même - ou abstenez- vous, si vous le souhaitez.

Henning Kockerbeck
la source
C'est donc !sacrément dangereux ... Je voudrais savoir ce qui !-4s'est passé exactement avant de l'exécuter. Ou cela vous montre-t-il d'abord? Résumé sympa!
Rudie
1
@Rudie C'est un bon point, j'ai mis à jour ma réponse. Les fonctionnalités d'historique sont principalement destinées à accélérer votre travail et à vous éviter des frappes. Donc un standard "Tu veux vraiment, vraiment dire ça?" irait au moins partiellement à l'encontre de cet objectif. Et même si vous le pouvez, normalement vous n'appelez pas une commande "loin en arrière" comme !-238. Il ne devrait pas être trop difficile de se souvenir de votre avant-dernière, troisième avant-dernière, peut-être cinquième commande;) Comme souvent avec Linux (et, en fait, avec l'informatique en général), on s'attend à ce que vous sachiez ce que vous faites. Et si vous voulez vraiment le filet de sécurité supplémentaire, il est à shoptportée de
main
16

Oui il y a. Si, par exemple, vous souhaitez exécuter la commande qui a le numéro 1234 à côté, faites:

!1234

Autres trucs utiles:

  • Si vous souhaitez exécuter la dernière commande que vous avez exécutée, procédez comme suit:

    !!
  • Si vous souhaitez exécuter la dernière lscommande que vous avez exécutée, procédez comme suit:

    !ls
  • Si vous venez de courir ls /some/long/pathet que vous le souhaitez cd, faites:

    cd !$

Pour plus d'informations:

Alaa Ali
la source
3

Si vous avez trouvé le numéro d'historique d'une commande et que vous souhaitez l'exécuter à nouveau, tapez !suivi du numéro, par exemple !1234et appuyez sur Enter. Cela fait partie de l'expansion de l' histoire ; vous pouvez y coller des modificateurs .

Si vous souhaitez modifier la commande avant de l'exécuter, fc 1234appelle un éditeur externe.

Mais comme Terry Wang l'a déjà mentionné, il existe généralement des moyens plus rapides de localiser une commande dans l'historique que de déterminer son numéro d'historique, y compris Ctrl+ Rpour appeler la recherche incrémentielle (appuyez Enterlorsque vous avez trouvé la commande que vous souhaitez exécuter), ou fc PREFIXpour exécuter la précédente commande commençant par PREFIX.

Gilles 'SO- arrête d'être méchant'
la source
1

La historycommande affichera toutes les commandes et leurs numéros associés. Si vous souhaitez simplement effectuer une vérification rapide avant d'exécuter la ligne de commande # 135, vous pouvez taper:

echo !135

Cela vous montrera ce qui va être exécuté.

Bruce M
la source