Set ve Shopt - Neden İki?


72

setve shopther ikisi de çeşitli seçenekleri kontrol eden kabuk yerleşimleridir. Hangi seçeneklerin hangi komut tarafından ayarlandığını ve hangi seçeneklerin / ayarların ( set -o/+o, shopt -s/-u) yapıldığını sık sık unutuyorum . Neden aynı şeyi yapan (ve bunu yapmak için farklı argümanları olan) iki farklı komut var? Hangi seçeneklerin hangi komutla gittiğini hatırlamanın kolay bir yolu / anımsatıcısı var mı?


6
İkinci hatta bakmayı deneyin help setve help shoptyazarlarının bile aynı şeyi yaptıklarını düşündüğünü doğrulayın.
lbb0,

2
Msgstr "Kabuk niteliklerinin değerini değiştir" vs "Her bir kabuk seçeneğinin ayarını değiştir".
Kevin,

2
Bash 4.1.5 (1) 'te yayınlayın, "Kabuk seçeneklerinin ve konumsal parametrelerin değerlerini ayarlama veya ayarlama" yazıyor. ve "Kabuk seçeneklerini ayarlayın ve açın.", sırasıyla.
lbb0,

Manpages yazmak, bilmediğiniz şeyleri fark etmenizi sağlar ve yazmayı denediğiniz şeyleri yanlış anlamadığınız şeyleri formüle etmenizi sağlar.
sjas,

Yanıtlar:


40

Bildiğim kadarıyla, set -oseçenekler diğer Bourne tarzı mermilerden (çoğunlukla ksh) miras kalanlar ve seçenekler ise bash'a shoptözgü olan seçenekler. Bildiğim hiçbir mantık yok.


1
Gösteren herhangi bir belge shoptmiras?
Felipe Alvarez,

8
Eh, orada set -ogibi seçenekler posix/ physical/ interactive-commentsolmadığından kshve shoptdahil olmak üzere diğer kabuklarda olanlar kshgibi bazı için login_shell/ ' nullglob. Söylediğin gibi, mantık yok. Muhtemelen başlangıçtaki fikir buydu (SHELLOPTS standart olanlar olurdu ve bash spesifik olanları BASHOPTS), ama bu yol boyunca kayboldu ve şimdi sadece sinir bozucu ve bir UI tasarım fiyasko olarak sona erer.
Stéphane Chazelas

22

Fark, bash tarafından kullanılan değişen ortam değişkenindedir. Komutla ayar yapmak setsonuçlanır $SHELLOPTS. Komutla ayar yapmak shoptsonuçlanır $BASHOPTS.


9
Ihh! Bu daha da kafa karıştırıcı. Beynim ilişkilendirmek istediği shopt$ ile SH ELL OPT yerine $ BA daha S shopt S.
Bruno Bronosky


8

Kolay ama tarihte kayboldu. setKomut başlangıçta orijinal Unix kabukları komut satırı ortamı değiştirmek için kullanılmıştır /bin/sh. Daha sonra çeşitli Unix sürümleri geliştikçe ve yeni kabuk tatları eklendiğinde, insanlar kabuk komut dosyasını uyumlu tutmak için daha fazla (çevre) şeyi değiştirebilmeleri gerektiğini anladılar. O zaman Bash çok popüler var ve ek sh ell opt iyonları tanıtan, ihtiyaç vardı shopt.

Aslında bunlar görebilirsiniz compat içinde ibility şablonu girişimlerini shoptkomutu.

$ 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

Ama setemrinde değil .

$ 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

2
setseçenekleri belirlemenin bir yolu, orijinal Unix mermilerinde olmadığı için, 70'li yılların sonlarında Bourne kabuğu tarafından tanıtıldı. set -o namekendisi daha sonra belirtilmiş ancak isteğe bağlı olarak POSIX'de isteğe bağlı olan, hala Solaris 10 gibi Bourne kabuğunun "modern" versiyonları tarafından desteklenmeyen Korn kabuğu tarafından eklenmiştir /bin/sh.
Stéphane Chazelas

5

Kitaptan "Bash ile Linux Kod Yazımı", s. 63:

Tarihsel olarak, setkomut seçenekleri açmak ve kapatmak için kullanıldı. Seçeneklerin sayısı arttıkça, setseçenekler tek harfli kodlarla gösterildiğinden kullanımı zorlaşmıştır. Sonuç olarak, Bash, harf yerine ada göre seçenekleri açmak ve kapatmak için shopt( kabuk seçeneği ) komutunu sağlar. Bazı seçenekleri yalnızca harf ile ayarlayabilirsiniz. Diğerleri sadece shoptkomut altında bulunur . Bu, belirli bir seçeneği bulma ve ayarlamayı kafa karıştırıcı bir görev haline getirir.


3

"Set" seçenekleri alt kabuklar tarafından miras alınır ve dükkanlar değildir.


Güzel yakalayış. Bunun kasıtlı bir seçim mi yoksa bir yan etki mi olduğunu merak ediyorum.
Kevin

2
@ en azından altında user29778 Bash 4.1.5 (1) ile ayarlanan seçenekler setsubshells.Both tarafından miras değildir setve shoptseçenekleri altkabuklarda tarafından miras değildir.
Martin,

Her iki miras özelliklerini açıklar belgelere işaret edebilir setve shopt?
Felipe Alvarez,

9
Hem set -ove shoptseçenekleri altkabuklarda (miras edilir (...), $(...)boru hattı bileşenleri). Diğer miras olsun bashçağrılardan bağlıdır SHELLOPTSveya BASHOPTSçevre ya da değil içindedir.
Stéphane Chazelas

0

setburne kabuğundan (sh) kaynaklanır ve POSIX standardının bir parçasıdır shopt, ancak burne tekrar kabuk (bash) özel değildir:

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

$ 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.