sety shoptson ambos componentes integrados de shell que controlan varias opciones. A menudo se olvide qué opciones son fijados por el que mando, y que establece opción / desarma ( set -o/+o, shopt -s/-u). ¿Por qué hay dos comandos diferentes que aparentemente hacen lo mismo (y tienen diferentes argumentos para hacerlo)? ¿Hay alguna manera fácil / mnemónica de recordar qué opciones van con cada comando?
72

help setyhelp shoptverificar que incluso sus autores piensan que hacen lo mismo.Respuestas:
Hasta donde sé, las
set -oopciones son las que se heredan de otros shells de estilo Bourne (principalmente ksh), y lasshoptopciones son las específicas de bash. No hay lógica que yo sepa.fuente
shoptes heredada?set -oopciones comoposix/physical/interactive-commentsque no están incluidaskshyshoptotras que están en otros shells, incluidaskshalgunas comologin_shell/nullglob. Como dices, no hay lógica. Probablemente fue la idea al principio (que SHELLOPTS serían los estándar y BASHOPTS los específicos de bash), pero eso se perdió en el camino, y ahora termina siendo molesto y un fiasco de diseño de interfaz de usuario.La diferencia está en la variable de entorno modificada utilizada por bash. La configuración con el
setcomando da como resultado$SHELLOPTS. La configuración con elshoptcomando da como resultado$BASHOPTS.fuente
shoptcon $ SH ELL OPT S en lugar de $ BA SHOPT S.setes POSIX 7: establecer - establecer o desactivar opciones y parámetros posicionales | pubs.opengroup.orgshoptno lo es: Shell y utilidades: Toc detallado | pubs.opengroup.orgProbablemente vinculado a la historia mencionada por @Gilles.
fuente
Fácil pero perdido en la historia. El
setcomando se usó originalmente para modificar el entorno de línea de comando de los shells originales de Unix/bin/sh. Luego, a medida que evolucionaron varias versiones de Unix, y se agregaron nuevos sabores de shell, las personas se dieron cuenta de que necesitaban poder cambiar más cosas (del entorno) para mantener la compatibilidad de los scripts de shell. En ese momento del golpe se puso muy popular y los adicionales sh ell opt se necesitaba iones, la introducciónshopt.En realidad se puede ver estas compat intentos bilidad en el
shoptcomando.Pero no en el
setcomando.fuente
setcomo una forma de establecer opciones no estaba en los shells originales de Unix, fue introducido por el shell Bourne a finales de los 70.set -o namesí mismo fue agregado más tarde por el shell Korn, especificado pero opcional en POSIX, aún no soportado por versiones "modernas" del shell Bourne como el/bin/shde Solaris 10.Del libro "Linux Shell Scripting with Bash", p 63:
fuente
Parece que las opciones de "conjunto" son heredadas por las subcapas y los shopts no.
fuente
setno son heredados por subshells.Bothsetyshoptopciones no se heredan por subcapas.setyshopt?set -oyshoptopciones son heredados por subniveles ((...),$(...), componentes de canalización). Ya sea que son heredados por otrasbashinvocaciones depende de siSHELLOPTSoBASHOPTSse encuentran en el medio ambiente o no.setse origina en el shell bourne (sh) y es parte del estándar POSIX;shoptsin embargo, no es y es específico del shell bourne-again (bash):fuente