set
y shopt
son 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 set
yhelp shopt
verificar que incluso sus autores piensan que hacen lo mismo.Respuestas:
Hasta donde sé, las
set -o
opciones son las que se heredan de otros shells de estilo Bourne (principalmente ksh), y lasshopt
opciones son las específicas de bash. No hay lógica que yo sepa.fuente
shopt
es heredada?set -o
opciones comoposix
/physical
/interactive-comments
que no están incluidasksh
yshopt
otras que están en otros shells, incluidasksh
algunas 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
set
comando da como resultado$SHELLOPTS
. La configuración con elshopt
comando da como resultado$BASHOPTS
.fuente
shopt
con $ SH ELL OPT S en lugar de $ BA SHOPT S.set
es POSIX 7: establecer - establecer o desactivar opciones y parámetros posicionales | pubs.opengroup.orgshopt
no 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
set
comando 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
shopt
comando.Pero no en el
set
comando.fuente
set
como 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 name
sí 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/sh
de 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
set
no son heredados por subshells.Bothset
yshopt
opciones no se heredan por subcapas.set
yshopt
?set -o
yshopt
opciones son heredados por subniveles ((...)
,$(...)
, componentes de canalización). Ya sea que son heredados por otrasbash
invocaciones depende de siSHELLOPTS
oBASHOPTS
se encuentran en el medio ambiente o no.set
se origina en el shell bourne (sh) y es parte del estándar POSIX;shopt
sin embargo, no es y es específico del shell bourne-again (bash):fuente