¿Qué significa! #: 3 en un comando de shell

29

La guía de instalación para ack sugiere instalar el script ack usando este comando:

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

Supongo que !#:3al final hay algún tipo de referencia, pero ¿qué significa? ¿Hay un equivalente en zsh? Google no ha sido útil.

Matt Pfefferle
fuente
55
Asumiendo bash; man bash, luego busque HISTORY EXPANSION
Jeff Schaller
1
Significa que mi gato cruzó el teclado en un mal momento.
IQAndreas
@ IQAndreas: Bueno, es un comando válido, por lo que tu gato debe ser lo suficientemente inteligente como para derrotar al detector de mecanografía . Claramente este no es un gato inútil. :-) ⁠
G-Man dice 'Restablecer a Monica' el

Respuestas:

32

Esta es una sintaxis especial, expandida por bash. También funciona para zsh.

De acuerdo con la página de manual de bash (sección EXPANSIÓN DE HISTORIA), el patrón se expande de la siguiente manera:

  • El designador de evento se !# refiere a la línea de comando completa escrita hasta ahora, que escurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :se divide entre el designador de eventos (en este caso, la línea completa) y el designador de palabras (selecciona una subparte)
  • el designador de palabras 3 que selecciona la tercera palabra / argumento (el recuento de palabras comienza en cero), en este caso ~/bin/ack.

La línea de comandos final (por lo general aparece antes ejecutado) es: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Para más detalles, consulte el manual de bash o muy similar al manual de zsh

jofel
fuente
77
No puedo evitar preguntarme: ¿quién pensó que esta característica sería una buena idea?
Rimo
3
@Rhymoid, yo no uso !#mucho, pero !!, !$, !*, !sud:py muchos otros son extremadamente útiles y los utilizo todo el tiempo. Echa un vistazo a unix.stackexchange.com/a/67/135943
Comodín el
11

En bash, es sustitución de historia (todas las sustituciones de historia comienzan con !). Específicamente, !#significa todo en la línea de comando hasta ahora, y la adición ': 3' significa la tercera palabra (comenzando a contar en 0).

Entonces, el comando anterior se traduce !#:3en ~/bin/ack.

Brian
fuente