Set and Shopp – Miért kettő? A

set és shopt héj beépítettek, amelyek különböző lehetőségek. Gyakran elfelejtem, hogy melyik beállítást melyik parancs állítja be, és melyik állítja be / állítja be (set -o/+o, shopt -s/-u). Miért van két különböző parancs, amelyek látszólag ugyanazt csinálják (és más érvekkel rendelkeznek)? Van-e valamilyen egyszerű módja annak, hogy emlékezzen arra, hogy melyik opció melyik parancshoz tartozik?

Megjegyzések

  • Próbálja meg megnézni a help set és help shopt annak ellenőrzésére, hogy még szerzőik is úgy gondolják, hogy ugyanazt csinálják.
  • " A shell attribútumok értékének megváltoztatása " vs " Az egyes shell opciók beállításainak módosítása ".
  • A Bash 4.1.5 (1) kiadásban a következőt írja: " A héjopciók és a helyzeti paraméterek beállítása vagy törlése. " és " A héjopciók beállítása és törlése. ".
  • Írás A manpages rádöbbenti azt, amit nem tud, és arra készteti, hogy megpróbálja megfogalmazni a dolgokat úgy, hogy tévesen gondolja azt, amiről ír.

Válasz

Ha jól tudom, a opciók azok, amelyeket más Bourne-stílusú héjaktól (többnyire ksh-től) örököltek, és a shopt opciók azok, amelyek specifikusak a bash-ra. Nincs olyan logika, amiről tudnék.

Megjegyzések

  • Minden olyan dokumentum, amely a shopt -et mutatja, öröklődik?
  • Nos, vannak set -o lehetőségek, mint például posix / physical / interactive-comments, amelyek nincsenek ksh és shopt kagyló, beleértve a következőt: ksh, például login_shell / nullglob. Mint mondod, ott ' nincs logika. Valószínűleg az volt az ötlet az elején (hogy a SHELLOPTS lesz a szokásos, és a BASHOPTS a bash specifikus), de ez elveszett az út során, és most ez csak bosszantó és felhasználói felület-fiaskó lesz.

Válasz

A különbség a megváltozott környezeti változóban van A bash által használt. A set paranccsal történő beállítással . A shopt paranccsal történő beállítás a $BASHOPTS eredményt eredményezi.

Megjegyzések

  • Ugh! Ez még zavaróbb. Az agyam a (z) shopt -t a $ SH ELL OPT S-hez akarja társítani, nem pedig a $ BA SHOPT S-hez .

Válasz

Válasz

Könnyű, de elveszett a történelemben. A set parancsot eredetileg az eredeti unix héjak parancssori környezetének módosítására használták /bin/sh. Aztán ahogy a különféle Unix verziók fejlődtek, és új shell ízeket adtak hozzá, az emberek rájöttek, hogy több (környezeti) dolgon változtatni kell ahhoz, hogy kompatibilisek legyenek a shell scriptek. Abban az időben Bash nagyon népszerű lett, és a további sh ell opt ionokra volt szükség, bevezetve a shopt -t.

Ezeket a compat ibility kísérletek a shopt parancsban.

$ 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 

De nem a set parancsban.

$ 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 

megjegyzések

  • set az opciók beállításának módja nem volt ' t az eredeti Unix héjakban a Bourne héj vezette be a 70-es évek végén. Magát az set -o name -et később a Korn shell adta hozzá, de megadta, de opcionális a POSIX-ban, amelyet továbbra sem támogat a " modern " a Bourne-shell változatai, például a Solaris 10 /bin/sh.

Válasz

A “Linux Shell Scripting with Bash” könyvből, 63. oldal:

Történelmileg a set parancsot használták az opciók be- és kikapcsolására. Az opciók számának növekedésével a set használat nehezebbé vált, mert az opciókat egybetűs kódok képviselik. Ennek eredményeként a Bash megadja a shopt ( shell opció ) parancsot az opciók betű helyett név szerinti be- és kikapcsolásához. Bizonyos opciókat csak levélben állíthat be. Mások csak a shopt paranccsal érhetők el. Ez egy adott opció megtalálását és beállítását zavaros feladattá teszi.

Válasz

Úgy tűnik, hogy a “beállított” opciókat az alhéjak öröklik a shopstok pedig nem.

Megjegyzések

  • Szép fogás. Kíváncsi vagyok, hogy ez szándékos választás, vagy mellékhatás.
  • @ user29778 Legalább a bash 4.1.5 (1) alatt a nem öröklik az alhéjak. Mind a set, mind a shopt opciókat nem öröklik meg az alhéjak.
  • Tudna mutatni a set és shopt öröklési jellemzőit leíró dokumentációra?
  • Mindkettő set -o és shopt opciókat az alhéjak öröklik ((...), $(...), csővezeték alkatrészei). Az, hogy más bash invokációk öröklik-e, attól függ, hogy SHELLOPTS vagy BASHOPTS vagy sem.

Válasz

set a bourne shell (sh) és a POSIX szabvány része, az shopt azonban nem, és a bourne-again shell (bash) specifikus:

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 $ 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük