¿Qué opciones de bash shell utiliza el analizador?

¿Qué opciones de bash shell utiliza el analizador?

Restringiendo nuestro enfoque exclusivamente a bash, enesta respuestaen Stack Overflow se informa lo siguiente.

extglobes una bandera usadapor el analizador. Funciones, comandos compuestos, etc. se analizan en su totalidad antes de la ejecución. Por lo tanto, extglobdebe 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 (cuando extglobno 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 extgloby, por lo tanto, no se pueden habilitar dentro de un comando de grupo que las usa?

En elshoptpágina en el bashmanualNo 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 especial
  • expand_aliases-- los alias se expanden bastante temprano en el procesamiento
  • extquote-- cambia el significado de algunas citas
  • interactive_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 dotgloby failglobsolo globstarafecta 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 extglobset 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 shoptcomando 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 -Oopción en la línea de comando, por ejemplo, en bash -O extglob -c 'echo !(foo)', el globo extendido funciona.

información relacionada