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
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áulposix
/physical
/interactive-comments
, amelyek nincsenekksh
ésshopt
kagyló, beleértve a következőt:ksh
, példáullogin_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
-
set
is POSIX 7: set – opciók és pozícióparaméterek beállítása vagy törlése | pubs.opengroup.org -
shopt
nem: Shell & Segédprogramok: Részletes Toc | pubs.opengroup.org
Valószínűleg a @Gilles által említett előzményekhez kapcsolódik.
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 azset -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 aset
használat nehezebbé vált, mert az opciókat egybetűs kódok képviselik. Ennek eredményeként a Bash megadja ashopt
( 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 ashopt
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 ashopt
opciókat nem öröklik meg az alhéjak. - Tudna mutatni a
set
ésshopt
öröklési jellemzőit leíró dokumentációra? - Mindkettő
set -o
ésshopt
opciókat az alhéjak öröklik ((...)
,$(...)
, csővezeték alkatrészei). Az, hogy másbash
invokációk öröklik-e, attól függ, hogySHELLOPTS
vagyBASHOPTS
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 $
help set
éshelp shopt
annak ellenőrzésére, hogy még szerzőik is úgy gondolják, hogy ugyanazt csinálják.