set
a shopt
jsou obě vestavěné prostředí, která ovládají různé možnosti. Často zapomínám, které možnosti jsou nastaveny kterým příkazem a které možnosti jsou nastaveny / zrušeny (set -o/+o
, shopt -s/-u
). Proč existují dva různé příkazy, které zdánlivě dělají totéž (a mají k tomu různé argumenty)? Existuje nějaký snadný způsob / mnemotechnická pomůcka k zapamatování si, které možnosti se k danému příkazu hodí?
Komentáře
Odpovědět
Pokud vím, je jsou ty, které se dědí z jiných shellů ve stylu Bourne (většinou ksh), a možnosti shopt
jsou ty, které jsou specifické pro bash. Neexistuje žádná logika, o které vím.
Komentáře
- Jakákoli dokumentace, která ukazuje
shopt
je zděděné? - Existují
set -o
možnosti jakoposix
/physical
/interactive-comments
které nejsou vksh
ashopt
v jiných skořápky včetněksh
pro některé jakologin_shell
/nullglob
. Jak říkáte, existuje ' s žádná logika. Pravděpodobně to byl nápad na začátku (že SHELLOPTS budou standardní a BASHOPTS specifické pro bash), ale ten se během cesty ztratil a teď právě končí nepříjemné a fiasko designu UI.
Odpověď
Rozdíl je ve změněné proměnné prostředí používá bash. Nastavení pomocí příkazu set
má za následek . Výsledkem nastavení pomocí příkazu shopt
je $BASHOPTS
.
Komentáře
- Fuj! To je ještě více matoucí. Můj mozek chce spojit
shopt
s $ SH ELL OPT S spíše než $ BA SHOPT S .
Odpověď
-
set
is POSIX 7: set – nastavit nebo zrušit nastavení a poziční parametry | pubs.opengroup.org -
shopt
není: Prostředí Shell &: Podrobný obsah | pubs.opengroup.org
Pravděpodobně souvisí s historií, kterou zmiňuje @Gilles.
Odpověď
Snadné, ale ztracené v historii. Příkaz set
byl původně použit k úpravě prostředí příkazového řádku původních skořápek unixu /bin/sh
. Poté, co se vyvinuly různé verze Unixu a byly přidány nové příchutě prostředí, si lidé uvědomili, že potřebují být schopni změnit více věcí (prostředí), aby zůstali kompatibilní se skripty prostředí. V té době byl Bash velmi populární a další sh ell opt bylo zapotřebí iontů, které představují shopt
.
Tyto compat pokusy o ibility v příkazu 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
Ale ne v příkazu 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
Komentáře
-
set
jako způsob nastavení možností nebyl ' t v původních skořápkách Unixu, byl představen shellem Bourne na konci 70. let. Samotnýset -o name
byl přidán shellem Korn, specifikovaným, ale volitelným v POSIXu, stále není podporován " moderním " verze prostředí Bourne jako/bin/sh
systému Solaris 10.
Odpověď
Z knihy „Linux Shell Scripting with Bash“, s. 63:
Historicky byl k zapnutí a vypnutí voleb použit příkaz
set
. Jak počet možností rostl, používáníset
bylo obtížnější, protože možnosti jsou reprezentovány jednopísmennými kódy. Výsledkem je, že Bash poskytuje příkazshopt
( možnost prostředí ), pomocí kterého se možnosti zapínají a vypínají podle jména místo písmene. Určité možnosti můžete nastavit pouze písmenem. Ostatní jsou k dispozici pouze pod příkazemshopt
. Díky tomu je hledání a nastavení konkrétní možnosti matoucím úkolem.
Odpověď
Vypadá to, že možnosti „set“ jsou zděděny dílčími skořápkami a nákupy nejsou.
Komentáře
- Pěkný úlovek. Zajímalo by mě, zda se jedná o úmyslnou volbu nebo vedlejší účinek.
- @ user29778 Alespoň v části bash 4.1.5 (1) jsou možnosti nastavené pomocí
set
nejsou zděděny subshelly. Možnostiset
ashopt
nejsou zděděny subshelly. - Můžete poukázat na dokumentaci, která popisuje vlastnosti dědičnosti
set
ashopt
? - Both
set -o
ashopt
jsou zděděny podškrty ((...)
,$(...)
, komponenty potrubí). To, zda jsou zděděny jinýmibash
vyvoláním, závisí na tom, zdaSHELLOPTS
neboBASHOPTS
jsou v prostředí nebo ne.
Odpověď
set
pochází z bourne shell (sh) a je součástí standardu POSIX, shopt
však není a je specifický pro bourne-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
ahelp shopt
k ověření, že i jejich autoři si myslí, že dělají totéž.