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
shoptje zděděné? - Existují
set -omožnosti jakoposix/physical/interactive-commentskteré nejsou vkshashoptv jiných skořápky včetněkshpro 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
shopts $ SH ELL OPT S spíše než $ BA SHOPT S .
Odpověď
-
setis POSIX 7: set – nastavit nebo zrušit nastavení a poziční parametry | pubs.opengroup.org -
shoptnení: 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
-
setjako 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 namebyl 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/shsysté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ísetbylo 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í
setnejsou zděděny subshelly. Možnostisetashoptnejsou zděděny subshelly. - Můžete poukázat na dokumentaci, která popisuje vlastnosti dědičnosti
setashopt? - Both
set -oashoptjsou zděděny podškrty ((...),$(...), komponenty potrubí). To, zda jsou zděděny jinýmibashvyvoláním, závisí na tom, zdaSHELLOPTSneboBASHOPTSjsou 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 setahelp shoptk ověření, že i jejich autoři si myslí, že dělají totéž.