Comment puis-je obtenir un argument spécifique d'une commande précédente dans bash?

31

En bash, vous pouvez utiliser !*pour obtenir tous les arguments de la commande précédente. Par exemple, si vous le faisiez cp /some/path /some/other/pathet le faisiez ensuite mv !*, la deuxième commande serait étendue à mv /some/path /some/other/path.

Y a-t-il quelque chose comme ça qui peut être utilisé pour accéder à un argument spécifique à partir d'une commande au lieu de tous?

Wuffers
la source

Réponses:

38

Dans !*, !est le préfixe d' expansion de l' historique et *est le désignateur de mot qui signifie tous les arguments. Vous pouvez mémoriser la syntaxe générale sous la forme bang-line-colon-column ( colonne de !ligne :). Il existe de nombreux raccourcis possibles: la ligne par défaut est la ligne précédente, le spécificateur de colonne par défaut est «tous» et vous pouvez laisser les deux-points si le spécificateur de colonne n'est pas numérique (mais !3signifierait la ligne 3). Vous pouvez utiliser !:0pour désigner le nom de la commande, !:1, !:2, etc., de se référer à des arguments successifs, !:$le dernier mot, !:*pour tous les arguments, et plus encore.

Voir aussi cet article de Michael Mrozek sur Unix Stack Exchange .

Gilles, arrête de faire le mal
la source
1
Je l'ai essayé moi-même et cela n'a pas fonctionné, cependant. Après avoir examiné le poste de Michale Mrozek, il est dit à l' utilisation !:1, !:2. Après avoir utilisé la version avec les deux points, cela a fonctionné.
Wuffers
@MrMan: Oups, à droite, si vous laissez les deux points avec un nombre, le nombre est interprété comme un numéro de ligne. Désolé pour ça.
Gilles 'SO- arrête d'être méchant'
Aucun problème. Alors, je suppose que faire !1:1pointerait sur le premier argument de la première ligne?
Wuffers du
4

Personnellement, je n'aime vraiment pas cette fonctionnalité "expansion avec point d'exclamation" qui dérangera même si vous essayez echo "Hello World!"dans des shells interactifs (donc les scripts de sourcing qui supposent qu'ils seront exécutés en mode non interactif ne fonctionneront pas du tout).

J'ai donc défini set +o histexpandet commencé à rappeler des arguments avec la méthode suivante:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Notez que l'esc-astuce est dû au fait que je n'ai pas de méta-clé.

Benoit
la source
Je n'utilise presque jamais de points d'exclamation dans les commandes. La méthode du point d'exclamation fonctionne donc parfaitement pour moi.
Wuffers
Alors profitez-en. La plupart des nombreuses fonctionnalités de votre shell sont conçues pour seulement quelques utilisateurs.
Benoit
En fait, vous n'avez pas à échapper aux points d'exclamation. Faites echo 'Hello, orld!'. Notez les guillemets simples au lieu des doubles.
Wuffers