2012-10-14 12 views
5

Dalla pagina di installazione ACK (http://betterthangrep.com/install/) c'è un'installazione one-liner con curl:Unfamiliar sintassi della shell in ACK-grep script di installazione

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3 

ho capito che si tratta di ottenere il file dal sito Web e salvarlo in ~/bin/ack, quindi impostare i permessi, ma cosa fa l'ultima parte (! #: 3)? (Non riconosco la sintassi e Google non ha prodotto risultati utili)

+3

Sono il manutentore di betterthangrep.com e non sapevo nemmeno cosa facesse, se non sapere che funzionava. Grazie per avermi chiesto cosa avrei dovuto chiedere quando qualcuno me l'ha presentato. :) –

+1

Per favore non usare saluti come ["Grazie in anticipo!"] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from posts). E non aggiungerli ai post di altre persone. – NullUserException

risposta

6

Vedere la sezione ESPANSIONE DELLA STORIA in man bash, in particolare la sottosezione Word Designators. !#:3 si riferisce alla terza parola della pipe, che è (nel tuo esempio) ~/bin/ack. In ordine, le parole del comando sono curl, 0; http://betterthangrep.com/ack-standalone, 1; >, 2; ~/bin/ack, 3; &&, 4; chmod, 5; 0755, 6; !#:3, 7. Ovvero, !#:3 è un modo per ripetere il nome file senza utilizzare una variabile separata o un testo letterale.

Per quanto riguarda la domanda su > e gli spazi bianchi, notare che > è un metacarattere, che man bash definisce come un "carattere che, quando non quotato, separa le parole. Uno dei seguenti: | &;() <> scheda spazio ". Quindi gli spazi bianchi non influiscono sul fatto che > conta come un token. Notare che nell'esempio seguente, il primo 3 viene citato in modo che bash non lo interpreti come parte di un reindirizzamento 3>. Quando la riga è stata inserita, bash ha fatto eco alla linea espansa e poi l'ha eseguita.

$ seq '3'>bbb;cat !#:3 !#:2 ccc; head !#:3 !#:8 
seq '3'>bbb;cat bbb > ccc; head bbb ccc 
==> bbb <== 
1 
2 
3 

==> ccc <== 
1 
2 
3 
+0

È quella tokenizzata in base al significato o allo spazio bianco? Se fosse 'curl url> file', ora ci sarebbero due parole o quattro? –

+0

Viene tokenizzato in base agli spazi bianchi. Il conteggio inizia con zero, quindi 'arricciato 'è 0, l'URL 1, l'operatore di reindirizzamento 2 e il file 3. – chepner

+2

@AndyLester, vedi anche l'esempio aggiunto –

3

!# mezzi per eseguire il comando digitato fino ad ora, ma è possibile specificare un parametro con :n. :0 sarebbe la prima parola (curl), :1 la seconda (http...) e così via.