set
y shopt
son componentes de shell que controlan varios opciones. A menudo olvido qué opciones se establecen con qué comando y qué opción se establece / 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 forma fácil / mnemotécnica de recordar qué opciones van con qué comando?
Comentarios
Responder
Hasta donde yo sé, el son las que se heredan de otros shells de estilo Bourne (principalmente ksh), y las opciones shopt
son las que son específicas de bash. No hay lógica que yo sepa.
Comentarios
- Cualquier documentación que muestre
shopt
es ¿Heredado? - Bueno, hay
set -o
opciones comoposix
/physical
/interactive-comments
que no están enksh
yshopt
que están en otros shells que incluyenksh
para algunos comologin_shell
/nullglob
. Como dices, hay ' s no tiene 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 simplemente termina siendo molesto y un fiasco en el diseño de la interfaz de usuario.
Respuesta
La diferencia está en la variable de entorno modificada utilizado por bash. La configuración con el comando set
da como resultado . La configuración con el comando shopt
da como resultado $BASHOPTS
.
Comentarios
- ¡Uf! Eso es aún más confuso. Mi cerebro quiere asociar
shopt
con $ SH ELL OPT S en lugar de $ BA SHOPT S .
Responder
-
set
es POSIX 7: establecer – configurar o desarmar opciones y parámetros posicionales | pubs.opengroup.org -
shopt
no es: Shell & Utilidades: Toc detallado | pubs.opengroup.org
Probablemente vinculado al historial mencionado por @Gilles.
Respuesta
Fácil pero perdido en la historia. El comando set
se usó originalmente para modificar el entorno de línea de comandos de los shells de Unix originales /bin/sh
. Luego, a medida que evolucionaron varias versiones de Unix y se agregaron nuevos tipos de shell, la gente se dio cuenta de que necesitaban poder cambiar más cosas (del entorno) para mantener la compatibilidad con los scripts de shell. En ese momento, Bash se hizo muy popular y la sh ell opt se necesitaban iones, introduciendo shopt
.
De hecho, puede ver estos compat intentos de ibilidad en el comando shopt
.
$ shopt autocd off cdable_vars off cdspell off checkhash off checkjobs off checkwinsize off cmdhist on compat31 off compat32 off compat40 off compat41 off compat42 off complete_fullquote on direxpand off dirspell off dotglob off execfail off expand_aliases on extdebug off extglob off extquote on failglob off force_fignore on globstar off globasciiranges off gnu_errfmt off histappend on histreedit off histverify off hostcomplete on huponexit off interactive_comments on lastpipe off lithist off login_shell on mailwarn off no_empty_cmd_completion off nocaseglob on nocasematch off nullglob off progcomp on promptvars on restricted_shell off shift_verbose off sourcepath on xpg_echo off
Pero no en el comando set
.
$ set -o allexport off braceexpand on emacs on errexit off errtrace off functrace off hashall on histexpand on history on igncr off ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi off xtrace off
Comentarios
-
set
como una forma de establecer opciones wasn ' t en los shells originales de Unix, fue introducido por el shell Bourne a finales de los 70.set -o name
en sí mismo fue agregado más tarde por el shell Korn, especificado pero opcional en POSIX, todavía no es compatible con " modern " versiones del shell Bourne como/bin/sh
de Solaris 10.
Respuesta
Del libro «Linux Shell Scripting with Bash», p. 63:
Históricamente, el comando
set
se usaba para activar y desactivar opciones. A medida que crecía el número de opciones,set
se volvió más difícil de usar porque las opciones están representadas por códigos de una sola letra. Como resultado, Bash proporciona el comandoshopt
( opción de shell ) para activar y desactivar opciones por nombre en lugar de una letra. Puede configurar ciertas opciones solo por letra. Otros están disponibles solo bajo el comandoshopt
. Esto hace que encontrar y configurar una opción en particular sea una tarea confusa.
Respuesta
Parece que las opciones de «set» son heredadas por subshells y las tiendas no lo son.
Comentarios
- Buena captura. Me pregunto si se trata de una elección intencionada o de un efecto secundario.
- @ user29778 Al menos en bash 4.1.5 (1) las opciones configuradas con
set
no son heredadas por subcapas. Las opcionesset
yshopt
no son heredadas por subcapas. - ¿Puede señalar la documentación que describe las características de herencia tanto de
set
como deshopt
? - Ambos
set -o
yshopt
son heredadas por subcapas ((...)
,$(...)
, componentes de canalización). Si son heredados por otrasbash
invocaciones depende de siSHELLOPTS
oBASHOPTS
están en el entorno o no.
Respuesta
set
se origina en el bourne shell (sh) y es parte del estándar POSIX, shopt
sin embargo no lo es y es específico de bourne-again shell (bash):
0 sjas@ssg 14:31:45 ~ set | grep -e SHELLOPTS -e BASHOPTS BASHOPTS=checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor 0 sjas@ssg 14:31:51 ~ shopt | column -t | grep -v off checkwinsize on cmdhist on complete_fullquote on dotglob on expand_aliases on extglob on extquote on force_fignore on histappend on interactive_comments on progcomp on promptvars on sourcepath on 0 sjas@ssg 14:31:57 ~ set -o | column -t | grep -v off braceexpand on emacs on hashall on histexpand on history on interactive-comments on monitor on 0 sjas@ssg 14:37:41 ~ sh $ set -o Current option settings errexit off noglob off ignoreeof off interactive on monitor on noexec off stdin on xtrace off verbose off vi off emacs off noclobber off allexport off notify off nounset off priv off nolog off debug off $ shopt sh: 3: shopt: not found $
help set
yhelp shopt
para verificar que incluso sus autores piensan que ellos hacen lo mismo.