Quali sono le restrizioni dell'ambito per l'impostazione di shopt extglob. e altre opzioni?


8

La mia shell bash non interattiva ha extglob off. Vorrei attivarlo nell'istruzione immediatamente prima di un comando, ma ho notato che quando si shopt -s extglobtrova all'interno di un if .. then .. elseblocco, in qualche modo non si registra.

Il seguente extglob-dipendente comando non è valido: syntax error near unexpected token '('.

Dove può extglobessere impostato e perché esiste una restrizione? Questo vale per altre opzioni? ... GNU bash 4.1.5

Questo funziona:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi

Questo fallisce:

if true ;then
    shopt -s extglob
    touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)' 

Risposte:


14

Non sono sicuro che ci sia una fonte più autorevole (es. Pagina man / documentazione ufficiale) su questo problema, ma ho trovato un sito che spiega questo comportamento: http://mywiki.wooledge.org/glob

Poiché l'opzione extglob modifica il modo in cui vengono analizzati determinati caratteri, è necessario disporre di una nuova riga (non solo un punto e virgola) tra il comando shopt e tutti i comandi successivi che utilizzano globi estesi. Allo stesso modo, non è possibile inserire shopt -s extglob in un blocco di istruzioni che utilizza globi estesi, poiché il blocco nel suo insieme deve essere analizzato quando è definito; il comando shopt non avrà effetto fino alla valutazione del blocco, a quel punto è troppo tardi. Infatti quando bash analizza l'intero blocco di istruzioni prima di valutarne uno, è necessario impostare extglob al di fuori del blocco più esterno.


1
Grazie. Il collegamento Wooledge lo copre abbastanza bene. Suppongo che debba essere implementato in quel modo a causa di alcuni problemi di eredità.
Peter

@ Peter.O direi che è così perché il parser di bash è traballante. Certo, sono un utente zsh dalla bocca sporca, tranne per il fatto che mi sembra di ricordare che questo è il motivo ufficiale indicato nella mailing list di bash. Bash ha molti problemi di analisi simili, come alias e=echo; e hellonon funzionare: la definizione di alias ha luogo solo sulla nuova riga successiva.
Gilles 'SO- smetti di essere malvagio' il

È interessante, grazie ... Un giorno, mi guarderò intorno guardando Zsh. Sembra avere tutte le campane e fischietti; quelli molto compatti.
Peter
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.