Establecer y comprar: ¿por qué dos?

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

  • Intente mirar la segunda línea de help set y help shopt para verificar que incluso sus autores piensan que ellos hacen lo mismo.
  • " Cambiar el valor de los atributos de shell " vs " Cambiar la configuración de cada opción de shell ".
  • En Bash 4.1.5 (1) -release dice " Establecer o desarmar valores de opciones de shell y parámetros posicionales. " y " Establecer y desarmar opciones de shell. ", respectivamente.
  • Escritura manpages te hace darte cuenta de lo que no sabes y te hace intentar formular las cosas de una manera en la que no estás equivocado sobre lo que intentas escribir.

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 como posix / physical / interactive-comments que no están en ksh y shopt que están en otros shells que incluyen ksh para algunos como login_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

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 comando shopt ( 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 comando shopt. 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 opciones set y shopt no son heredadas por subcapas.
  • ¿Puede señalar la documentación que describe las características de herencia tanto de set como de shopt?
  • Ambos set -o y shopt son heredadas por subcapas ((...), $(...), componentes de canalización). Si son heredados por otras bash invocaciones depende de si SHELLOPTS o BASHOPTS 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 $ 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *