3 votes

Comment puis-je utiliser l'historique bash pour exécuter une commande en utilisant des arguments de l'historique?

Comment puis-je utiliser l'historique bash pour exécuter une commande avec les arguments d'une commande dans l'historique ?

Je sais que je peux utiliser !! pour réexécuter la dernière commande, mais comment puis-je exécuter une nouvelle commande avec ces arguments ?

Par exemple, je lance d'abord :

~/somefolder/script.sh somefile

Je veux exécuter rapidement :

~/somefolder/script.sh anotherfile

J'ai essayé !! anotherfile mais cela n'a pas fonctionné.

Ou même mieux, comment puis-je exécuter !-2 newarguments pour exécuter l'avant-dernière commande de l'historique avec de nouveaux arguments ?

Je ne veux pas utiliser les flèches pour naviguer dans l'historique puis effacer les arguments.

5voto

Billy McCloskey Points 1615

Pour choisir le nom de la commande, utilisez le modificateur :0 :

$ man bash
$ !!:0 csh
man csh

Choisissez tous les arguments de la commande la plus récente avec !* :

$ man sed awk perl
$ which !*
which sed awk perl
/usr/bin/sed
/usr/bin/awk
/usr/bin/perl

Choisissez la 2ème commande précédemment exécutée par rapport à la commande actuelle, et sélectionnez tous ses arguments avec :

$ echo !-2:*
echo sed awk perl
sed awk perl

Choisissez la 3ème commande précédemment exécutée par rapport à la commande actuelle, et sélectionnez son 2ème argument :

$ echo !-3:2
echo awk
awk

Choisissez la dernière commande qui a commencé par "which" et insérez son 3ème argument :

$ echo !which:3
echo perl
perl

Tout cela étant dit, voici les réponses à vos deux questions spécifiques :

  1. Voir le premier exemple ci-dessus.
  2. !-2:0 "nouvelle liste d'arguments"

0 votes

Lisez le manuel de BASh. ;-) Sachez simplement que vous sélectionnez d'abord une ligne, effectuez des substitutions, puis affinez cela avec des modificateurs, puis peut-être imprimez simplement le résultat :p. Explorez les lignes correspondantes avec !?text?, ou faites correspondre une occurrence du texte n'importe où dans une ligne de commande de l'historique pour faire correspondre la ligne. D'autres variantes font correspondre une ligne, puis ne saisissent pas simplement des morceaux de la ligne, mais effectuent un remplacement d'expression régulière avant d'exécuter la commande, c'est-à-dire !wh:gs/sed/tr/, la commande which se substitue à sed, tr.

-1voto

jadelord Points 177

Si vous appuyez sur le raccourci clavier Ctrl-R dans le terminal, et que vous tapez une partie unique de la commande, il effectue une recherche inversée et la trouve pour vous. Pas besoin de faire défiler toute la liste.

0 votes

Oui, je savais pour Ctrl-R, mais il faut quand même appuyer sur la touche retour arrière pour supprimer les arguments, ce que j'ai précisé dans la question que je ne voulais pas faire. Merci pour la réponse de toute façon. Au fait, je ne suis pas celui qui vous a donné un vote négatif.

0 votes

@localhost Si une réponse n'est pas utile pour votre question, vous devriez la voter négativement. C'est ainsi que fonctionne le système; vous n'avez pas à vous excuser pour cela.

0 votes

@slhck Peut-être vrai dans le strict respect de la loi, mais cela semble un peu impoli de voter négativement contre quelqu'un qui fait un effort honnête. Si je ne connaissais pas Ctrl-R, la réponse de jadelord m'aurait quand même aidé un peu. Votre point est bien pris cependant.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X