Restringiendo nuestro enfoque exclusivamente a bash
, enesta respuestaen Stack Overflow se informa lo siguiente.
extglob
es una bandera usadapor el analizador. Funciones, comandos compuestos, etc. se analizan en su totalidad antes de la ejecución. Por lo tanto,extglob
debe establecerse antes de analizar ese contenido; configurarlo en el momento de la ejecución pero después del tiempo de análisis no tiene ningún efecto para el contenido analizado previamente.Esta es también la razón por la que no puede ejecutar
shopt -s extglob; ls !(*.txt)
como una sola línea (cuandoextglob
no está configurada previamente), sino que debe tener una nueva línea entre los dos comandos.
Sin embargo, esto no es cierto para otras opciones de shell. Considere, por ejemplo, lo siguiente.
$ ls -a
. .. .hiddenFile file1 file2 file3
$ shopt dotglob
dotglob off
$ echo *
file1 file2 file3
$ shopt -s dotglob; echo *
.hiddenFile file1 file2 file3
¿Está documentado en algún lugar qué opciones de Shell utiliza el analizador extglob
y, por lo tanto, no se pueden habilitar dentro de un comando de grupo que las usa?
En elshopt
página en el bash
manualNo parece mencionarse nada sobre el comportamiento anterior.
Respuesta1
¿Está documentado en algún lugar qué opciones de Shell utiliza el analizador como extglob y, por lo tanto, no se pueden habilitar dentro de un comando de grupo que las use?
Es difícil probar algo negativo, pero dudo que haya una lista completa.
Los que encontré que afectan el análisis se encuentran a continuación, puede haber otros:
extglob
-- cambia el significado de los paréntesis, que de otro modo son un carácter especialexpand_aliases
-- los alias se expanden bastante temprano en el procesamientoextquote
-- cambia el significado de algunas citasinteractive_comments
-- cambia el significado de#
al comienzo de la palabra.
Algunas de las compat*
opciones también pueden tener efectos similares, pero dejaré que alguien más interesado las pruebe.
Por otro lado, algo como dotglob
y failglob
solo globstar
afecta el resultado de un globo, no cómo se analiza.
Con respecto a extglob
, una línea de comando como !(foo)
es válida con extglob
set o sin él. Con él, es un globo que coincide con todos los archivos excepto foo
, y sin él, es un subshell que ejecuta el comando foo
, con el valor de retorno invertido.
Tenga en cuenta que, en la práctica, esto no debería ser un problema. En un script, puede colocar el shopt
comando en una línea propia, de modo que los cambios en el análisis afecten a la siguiente línea sin problemas. En una sola línea, puede usar la -O
opción en la línea de comando, por ejemplo, en bash -O extglob -c 'echo !(foo)'
, el globo extendido funciona.