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
shoptes ¿Heredado? - Bueno, hay
set -oopciones comoposix/physical/interactive-commentsque no están enkshyshoptque están en otros shells que incluyenkshpara 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
shoptcon $ SH ELL OPT S en lugar de $ BA SHOPT S .
Responder
-
setes POSIX 7: establecer – configurar o desarmar opciones y parámetros posicionales | pubs.opengroup.org -
shoptno 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
-
setcomo 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 nameen 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/shde Solaris 10.
Respuesta
Del libro «Linux Shell Scripting with Bash», p. 63:
Históricamente, el comando
setse usaba para activar y desactivar opciones. A medida que crecía el número de opciones,setse 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
setno son heredadas por subcapas. Las opcionessetyshoptno son heredadas por subcapas. - ¿Puede señalar la documentación que describe las características de herencia tanto de
setcomo deshopt? - Ambos
set -oyshoptson heredadas por subcapas ((...),$(...), componentes de canalización). Si son heredados por otrasbashinvocaciones depende de siSHELLOPTSoBASHOPTSestá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 setyhelp shoptpara verificar que incluso sus autores piensan que ellos hacen lo mismo.