Set and Shopt – Why Two? (Čeština)

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

  • Zkuste se podívat na druhý řádek help set a help shopt k ověření, že i jejich autoři si myslí, že dělají totéž.
  • " Změňte hodnotu atributů prostředí " vs " Změňte nastavení každé možnosti prostředí ".
  • V Bash 4.1.5 (1) – vydání uvádí " Nastavit nebo zrušit nastavení možností prostředí a pozičních parametrů. " a " Nastavení a zrušení nastavení možností prostředí. ".
  • Psaní manpages vás přimějí uvědomit si, co nevíte, a přiměje vás zkusit formulovat věci tak, že se nemýlíte v tom, o čem se snažíte psát.

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 jako posix / physical / interactive-comments které nejsou v ksh a shopt v jiných skořápky včetně ksh pro některé jako login_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ěď

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říkaz shopt ( 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říkazem shopt. 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žnosti set a shopt nejsou zděděny subshelly.
  • Můžete poukázat na dokumentaci, která popisuje vlastnosti dědičnosti set a shopt?
  • Both set -o a shopt jsou zděděny podškrty ((...), $(...), komponenty potrubí). To, zda jsou zděděny jinými bash vyvoláním, závisí na tom, zda SHELLOPTS nebo BASHOPTS 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 $ 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *