Cosa significa! #: 3 in un comando shell


29

La guida all'installazione di ack suggerisce di installare lo script ack usando questo comando:

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

Presumo che !#:3alla fine sia una specie di riferimento a ritroso, ma cosa significa? Esiste un equivalente in zsh? Google non è stato utile.


5
Supponendo bash; man bash, quindi cerca ESPANSIONE STORIA
Jeff Schaller

1
Significa che il mio gatto ha attraversato la tastiera in un momento davvero brutto.
IQAndreas,

@IQAndreas: Beh, è ​​un comando valido, quindi il tuo gatto deve essere abbastanza intelligente da sconfiggere il rilevatore di tipizzazione del gatto . Chiaramente questo non è un gatto inutile. :-) ⁠
G-Man dice "Ripristina Monica" il

Risposte:


32

Questa è una sintassi speciale, espansa da bash. Funziona anche con zsh.

Secondo la pagina man di bash (sezione ESPANSIONE STORIA), il modello si espande come segue:

  • Il designatore di eventi si !# riferisce all'intera riga di comando digitata finora che ècurl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755
  • :si divide tra il designatore di eventi (in questo caso l'intera riga) e il designatore di parole (seleziona una sottoparte)
  • il designatore di parole 3 che seleziona la terza parola / argomento (il conteggio delle parole inizia da zero), in questo caso ~/bin/ack.

La riga di comando finale (di solito visualizzato prima esecuzione) è: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack.

Per i dettagli, consultare il manuale di bash o molto simile al manuale di zsh


7
Non posso fare a meno di chiedermi: chi pensava che questa funzione sarebbe mai stata una buona idea?
Rhymoid,

3
@Rhymoid, io non uso !#molto, ma !!, !$, !*, !sud:pe molti altri sono tutti estremamente utile e io uso loro tutto il tempo. Dai
Wildcard il

11

In bash, è la sostituzione della storia (tutte le sostituzioni della storia iniziano con !). In particolare, !#significa tutto sulla riga di comando finora e l'aggiunta ': 3' indica la terza parola (a partire da 0).

Quindi, il comando sopra si traduce !#:3in ~/bin/ack.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.