bash set posix standards sh

¿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.