2009-07-14 13 views
5

Non ho familiarità con la semantica di "- @" nello snippet di script di bash qui sotto, che è da /etc/bash_completion.d/subversion. Sto cercando di capire perché i rapporti bash "Errore di sintassi nei pressi di token imprevisto '(' su questa linea, ho due domande:Sintassi del caso Bash - significato di "- @"

  1. ciò che è '-? @()' Dovrebbe fare qui
  2. Perché bash potrebbe essere infelice con questa affermazione?

    case $prev in 
           # other cases omitted 
        [email protected](F|-file|-targets)) 
         _filedir 
         return 0; 
         ;; 
           # other cases omitted 
         esac 
    

risposta

4

Il '@ (...)' qui fa parte del pattern matching sintassi di bash. si tratta di una "o", esso corrisponde semplicemente uno dei modelli elencati , separati da caratteri del tubo

Il trattino iniziale è stato semplicemente scomposto dall'espressione; "- @ (a | b | c)" è uguale a "@ (- a | -b | -c)", ma più corto.

Come indicato da un commentatore (grazie!), Ciò richiede il funzionamento di Bash extglob. Questo viene fatto in questo modo:

shopt -s extglob 

È possibile controllare se hai già attivato in questo modo:

shopt extglob 
+1

Sto supponendo che "- @ (F | -file | -targets)" è equivalente a "-F | --file | --targets" (dove '|' significa "o"), ma non ho " Sono stato in grado di confermare dalla documentazione. –

+0

http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching Vedere la parte inferiore della sezione in cui è indicato 'extglob'. – ephemient

0

La "@" è un modello che significa "corrisponde una e una sola". E sembra che tu abbia un paren di chiusura extra nel tuo esempio di codice, che è un errore di digitazione o un errore di sintassi.

+1

Non è la parte finale di chiusura della sintassi del caso? Vedi qui, ad esempio: . – unwind

0

Questo è del tutto una supposizione, come io non sono Conoscete tutti la sintassi bash, ma penso che dovrebbe essere più simile a:

@(-F|-file|-targets)) 

... che ha un senso date le altre risposte qui - @() corrisponde a uno degli argomenti del comando e l'ulteriore ) fa parte della struttura del caso. Penso solo che il trattino sia nel posto sbagliato.

+0

Vedi il commento di Lance Richardson sulla risposta di svolgersi. –

1

Ho trovato la risposta alla seconda parte della mia domanda, ovvero che per abilitare "@ (...)", l'opzione shell "extglob" deve essere attiva. Executing:

shopt -s extglob 

prima di eseguire lo script elimina l'errore.

Problemi correlati