Aseta ja osta – miksi kaksi?

set ja shopt ovat molemmat kuoren sisäisiä rakenteita, jotka ohjaavat erilaisia vaihtoehtoja. Unohdan usein, mitkä vaihtoehdot asetetaan millä komennolla ja mitkä asetetaan / poistetaan (set -o/+o, shopt -s/-u). Miksi on olemassa kaksi erilaista komentoa, jotka näennäisesti tekevät saman asian (ja joilla on eri argumentit tehdä niin)? Onko olemassa jokin helppo tapa / muistitikku muistaa mitkä vaihtoehdot mihin komentoon kuuluvat?

Kommentit

  • Yritä katsoa help set ja help shopt varmistaakseen, että jopa heidän kirjoittajansa uskovat tekevänsä samaa asiaa.
  • " Muuta komentotulkkomääritteiden arvoa " vs " Muuta kunkin kuorivaihtoehdon asetusta ".
  • Bash 4.1.5 (1) -julkaisussa sanotaan " Aseta tai poista kuorivaihtoehtojen ja sijaintiparametrien arvot. " ja " Aseta ja poista kuorivaihtoehdot. ".
  • Kirjoittaminen manpages saa sinut ymmärtämään, mitä et tiedä, ja saa sinut yrittämään muotoilla asioita tavalla, josta olet väärässä siitä, mistä yrität kirjoittaa.

Vastaa

Sikäli kuin tiedän, -asetukset ovat ne, jotka peritään muista Bourne-tyylisistä kuoreista (enimmäkseen ksh), ja shopt -vaihtoehdot ovat bashille ominaisia. Tiedon logiikkaa ei ole.

Kommentit

  • Kaikki asiakirjat, jotka osoittavat shopt, ovat peritty?
  • No, on set -o vaihtoehtoja, kuten posix / physical / interactive-comments, jotka eivät ole ksh ja shopt, jotka ovat muissa kuoret sisältäen ksh joillekin, kuten login_shell / nullglob. Kuten sanot, siellä ' ei ole logiikkaa. Luultavasti alussa oli ajatus (että SHELLOPTS olisivat tavallisia ja BASHOPTS bash-spesifisiä), mutta se eksyi matkan varrella, ja nyt se on vain ärsyttävää ja käyttöliittymäsuunnittelufiasko.

Vastaus

Ero on muuttuneessa ympäristömuuttujassa bash käyttää. Asetuksella komennolla set saadaan . Asetuksella shopt -komennolla saadaan $BASHOPTS.

Kommentit

  • Huh! Se on vielä hämmentävämpää. Aivoni haluavat liittää shopt -palvelun $ SH ELL OPT S: ään eikä $ BA SHOPT S: ään .

vastaus

Vastaa

Helppo mutta menetetty historiaan. set -komentoa käytettiin alun perin alkuperäisten unix-kuorien komentoriviympäristön muokkaamiseen /bin/sh. Sitten, kun erilaiset Unix-versiot kehittyivät ja uusia kuorimakuja lisättiin, ihmiset huomasivat, että heidän on pystyttävä muuttamaan enemmän (ympäristö) asioita pitääkseen komentosarjan komentosarjat yhteensopivina. Tuolloin Bash sai suuren suosion ja ylimääräinen sh ell opt -ioneja tarvitaan, esittelemällä shopt.

Näet todella nämä compat ibility-yritykset komennossa 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 

Mutta ei komennossa 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 

kommentit

  • set keinona asettaa asetuksia ei ollut ' t alkuperäisissä Unix-kuoreissa, Bourne-kuori esitteli sen 70-luvun lopulla. set -o name itsensä lisäsi myöhemmin Korn-kuori, joka oli määritelty mutta valinnainen POSIXissa, jota " moderni " Bourne-kuoren versiot, kuten Solaris 10: n /bin/sh.

vastaus

Kirjassa ”Linux Shell Scripting with Bash”, s. 63:

Historiallisesti komentoa set käytettiin asetusten kytkemiseen päälle ja pois. Kun vaihtoehtojen määrä kasvoi, set -sovelluksen käyttö vaikeutui, koska vaihtoehtoja edustavat yhden kirjaimen koodit. Tämän seurauksena Bash tarjoaa shopt ( shell-vaihtoehto ) -komennon, joka ottaa asetukset käyttöön ja pois käytöstä nimen perusteella kirjaimen sijaan. Voit asettaa tiettyjä asetuksia vain kirjeitse. Muut ovat käytettävissä vain shopt -komennolla. Tämä tekee tietyn vaihtoehdon löytämisestä ja asettamisesta hämmentävän tehtävän.

vastaus

Näyttää siltä, että ”set” -vaihtoehdot peritään alikuorilta ja shopts eivät.

Kommentit

  • Hieno saalis. Ihmettelen, onko tämä tarkoituksellinen valinta vai sivuvaikutus.
  • @ user29778 Ainakin bash 4.1.5 (1) -kohdassa set ei peri alihakemistoista. Sekä set että shopt -vaihtoehtoja ei peri alisarjat.
  • Voitteko viitata dokumentaatioon, joka kuvaa sekä set että shopt?
  • Molempien set -o – ja shopt -vaihtoehdot peritään alikuorilta ((...), $(...), putkiston komponentit). Perittävätkö ne muut bash -kutsujen, riippuen siitä, ovatko SHELLOPTS vai BASHOPTS ympäristö tai ei.

Vastaus

set on peräisin bourne shell (sh) ja on osa POSIX-standardia, shopt ei kuitenkaan ole ja on bourne-again shell (bash) -kohtainen:

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 $ 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *