¿Error de Bash? Cuando la configuración de `$HISTIGNORE` termina con `SP`+`*` o `SP`+`?*`

¿Error de Bash? Cuando la configuración de `$HISTIGNORE` termina con `SP`+`*` o `SP`+`?*`

Cuando se configura $HISTIGNOREel final con SP+ *o SP+ ?*, las listas de archivos en la carpeta actual se concatenarán a su valor.

No importa extglobsi está armado o desarmado.

Ejemplo NG (la carpeta actual tiene solo un archivo 'do_music.sh'):

$ export HISTIGNORE="ls:ls *:history:history *:sudo *"
$ echo $HISTIGNORE
ls:ls *:history:history *:sudo do_music.sh
$

Aceptar Ejemplo:

$ export HISTIGNORE="ls:ls *:history *:sudo *:history"
$ echo $HISTIGNORE
ls:ls *:history *:sudo *:history
$

Respuesta1

Actualización 2

Según mi respuesta original, debes usar comillas simples para que *permanezca como está. Si haces eso, la variable HISTIGNOREcontendrá solo la *expansión y no la expansión. Cuando usted echove que se produce la expansión, porque el shell reemplaza $HISTIGNOREcon a *y luego sustituye con la lista de archivos.

Puede verificar ejecutando env | grep HISTIGNOREen ambos casos. En el "caso verás do_music.shallí, en el 'caso verás el *.

Además, puede intentar ejecutar la export HISTIGNORElínea mientras está en un directorio y la echolínea mientras está en otro, verá una diferencia dependiendo de si usa 'o"

(Taché la parte anterior porque resulta ser falsa; después de todo, tanto las comillas simples como las dobles deberían funcionar en su caso, ya que *tampoco se sustituyen dentro de las comillas dobles).

Actualización 3

La razón por la que obtienes este echocomportamiento es por el orden de las sustituciones en bash. Según el manual:

       The  order of expansions is: brace expansion; tilde expansion, parameter and vari‐
       able expansion, arithmetic expansion, and command substitution (done in a left-to-
       right fashion); word splitting; and pathname expansion.

Primero sucede elparámetro/variableexpansión (los $HISTIGNOREcambios a *), y después de eso sucede elnombre de rutaexpansión (los *cambios en la lista de archivos).

Respuesta original a continuación

Cuando ejecutas la primera línea:

export HISTIGNORE="ls:ls *:history:history *:sudo *"

el shell ya expande el último *a la lista de archivos en su directorio, es por eso que llega do_music.sha ese lugar.

Si tuviera un archivo llamado, por ejemplo bla:sudo, *:sudotambién sería sustituido por este. No es así, porque ningún archivo coincide con ese patrón.

Para evitar que esto suceda, debes usar comillas simples para evitar *sustituciones:

export HISTIGNORE='ls:ls *:history:history *:sudo *'

Actualizar

Por cierto, HISTIGNORE no tiene nada de especial, esto sucedería para cualquier definición de variable, o para cualquier comando en ese sentido, si tiene un *"sí" en algún lugar entre comillas dobles, será sustituido por la lista de archivos (¡sin comenzar con .! ) en el directorio actual (a menos que el directorio actual esté vacío o solo contenga archivos que comiencen con ., en cuyo caso *permanecerá como está).

información relacionada