¿Cuál es el orden efectivo previsto de las opciones `set-o` en bash? ¿`Histexpand` triunfo` posix`?
standards (2)
Intenté responder a una pregunta hace un par de horas que creí revelar un error algo oscuro en el modo POSIX de bash . Me dijeron apresurada y vehementemente que esto no era así. La respuesta contradictoria, que explícitamente dice que esto no es un error, fue seleccionada como la respuesta correcta.
Así que he estado revisando la documentación de bash, y sigo saliendo con la misma impresión, así que pensé que debería preguntar.
Mi (supuesto) error:
set -o histexpand
(que normalmente es implícito)
set -o posix
echo "#!/"
Debería, bueno, echo #!/
. (Lo hace en cualquier otro shell). Pero en bash, en cambio imprime en salida estándar
!/: event not found
Y luego devuelve 0.
Por lo tanto, me parece que el set -o histexpand
implícito de bash set -o histexpand
es, en raras ocasiones, en contravención del estándar POSIX, y no da lugar al set -o posix
.
La documentación para set -o posix
dice:
Change the behavior of Bash where the default operation differs from the POSIX standard ... This is intended to make Bash behave as a strict superset of that standard.
¿Y siempre he pensado que esto significaba que esta opción debería reemplazar a otras opciones cuando se contradicen? Esta tampoco parece ser una de las 48 diferencias enumeradas .
¿No es este el caso? ¿Qué me estoy perdiendo?
Desde la referencia de Bash POSIX Mode , esperaría el comportamiento que está viendo: no dice en ningún lugar de la lista que los números de historial (fuera de las expansiones de PS1
y PS2
) serán tratados de manera diferente con el conjunto posix
. Además, como otros dijeron que no era un error, supongo que el significado de "superconjunto" es que , siempre que no existan configuraciones específicas de Bash, el shell se comportará de acuerdo con el estándar POSIX.
Curiosamente, incluso si ejecuta bash --noprofile --norc --posix
algunas configuraciones específicas de Bash bash --noprofile --norc --posix
por defecto:
bash-4.2$ set -o | grep ''on$''
braceexpand on
emacs on
hashall on
histexpand on
history on
interactive-comments on
monitor on
posix on
Ninguno de estos se menciona en la documentación del lenguaje de comandos de shell POSIX (busqué sus atajos en man bash
primero), y interactive-comments
no se mencionan en ninguna parte .
Para desactivar la expansión de historial desde "!" tokens, uso
set +o histexpand
En cambio, tuviste un "-o" Counter-intuitivamente, "+ o" apaga el histexpand.