Que signifie! #: 3 dans une commande shell

29

Le guide d'installation pour ack suggère d'installer le script ack à l'aide de cette commande:

curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 

Je suppose que la !#:3fin est une sorte de référence arrière, mais qu'est-ce que cela signifie? Existe-t-il un équivalent dans zsh? Google n'a pas été utile.

Matt Pfefferle
la source
5
En supposant que bash; man bash, puis recherchez EXPANSION D'HISTOIRE
Jeff Schaller
1
Cela signifie que mon chat a traversé le clavier à un très mauvais moment.
IQAndreas
@IQAndreas: Eh bien, c'est une commande valide, donc votre chat doit être assez intelligent pour vaincre le détecteur de frappe de chat . De toute évidence, ce n'est pas un chat inutile. :-) ⁠
G-Man dit 'Reinstate Monica'

Réponses:

32

Il s'agit d'une syntaxe spéciale, développée par bash. Cela fonctionne également pour zsh.

Selon la page de manuel bash (section HISTORY EXPANSION), le modèle se développe comme suit:

  • Le désignateur d'événement !# fait référence à la ligne de commande entière tapée jusqu'à présent, qui estcurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :se divise entre l' indicateur d'événement (dans ce cas, la ligne entière) et le mot désignateur (sélectionne une sous-partie)
  • le désignateur de mot 3 qui sélectionne le troisième mot / argument (le comptage des mots commence à zéro), dans ce cas ~/bin/ack.

La ligne de commande finale (généralement affiché avant exécuté) est: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Pour plus de détails, consultez le manuel bash ou très similaire au manuel zsh

jofel
la source
7
Je ne peux pas m'empêcher de me demander: qui a pensé que cette fonctionnalité serait jamais une bonne idée?
Rhymoid
3
@Rhymoid, je n'utilise pas !#beaucoup, mais !!, !$, !*, !sud:pet bien d' autres sont tous très utiles et je les utilise tout le temps. Consultez unix.stackexchange.com/a/67/135943
Wildcard
11

Dans bash, c'est la substitution d'historique (toutes les substitutions d'historique commencent par !). Plus précisément, !#signifie tout ce qui se trouve sur la ligne de commande jusqu'à présent, et l'addition «: 3» signifie le troisième mot (départ à 0).

Ainsi, la commande ci-dessus se traduit !#:3par ~/bin/ack.

Brian
la source